es6 生成器

2023-05-12  本文已影响0人  冷暖自知_zjz

使用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);
上一篇下一篇

猜你喜欢

热点阅读