美文网首页
es6 生成器

es6 生成器

作者: 冷暖自知_zjz | 来源:发表于2023-05-12 18:55 被阅读0次

    使用ES6的yield和generator函数可以模拟实现async/await的功能,具体实现方法如下:

    function* asyncFunction (){
      try {
        // 异步操作
        const result = yield promise;
        console.log(result);
      } catch (error) {
        console.error(error);
      }
    }
    
    // 调用方法
    const generateAsync = asyncFunction();
    const asyncExecute = generateAsync.next();
    asyncExecute.value.then(result =>{
      generateAsync.next(result);
    }).catch(error => {
      generateAsync.throw(error);
    });
    
    

    在这里,我们首先定义一个generator函数asyncFunction,其内部包含异步操作,并通过yield关键字将流程分割成若干段,在异步操作完成时将结果返回。在调用函数时,我们可以使用对象的next方法依次执行yield命令的部分,直到整个异步操作流程结束。

    以上是一个简略的实现方式,并不是完整的async/await实现,因为async/await还包含了一些其他的特性,例如自动捕获异常等等。但是使用这种方式,我们也可以达到一定程度上类似于async/await的效果。

    function getFoo () {
      return new Promise(function (resolve, reject){
        resolve('foo');
      });
    }
    
    const g = function* () {
      try {
        const foo = yield getFoo();
        console.log(foo);
      } catch (e) {
        console.log(e);
      }
    };
    
    function run (generator) {
      const it = generator();
    
      function go(result) {
        if (result.done) return result.value;
    
        return result.value.then(function (value) {
          return go(it.next(value));
        }, function (error) {
          return go(it.throw(error));
        });
      }
    
      go(it.next());
    }
    
    run(g);
    

    相关文章

      网友评论

          本文标题:es6 生成器

          本文链接:https://www.haomeiwen.com/subject/mvtysdtx.html