Generator 与 asnyc await

Generator 生成器函数,返回一个迭代器对象,可以手动调用 next 方法来控制执行,throw 方法抛出错误,return 方法来提前结束,也可以使用 for...of 自动遍历遍历。

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

let g = gen();
g.next(); // output: { value: 1, done: false }
g.next(); // output: { value: 2, done: false }
g.next(); // output: { value: 3, done: false }
g.next(); // output: { value: undefined, done: true }

for (const value of gen()) {
  console.log('value :>> ', value);
}
// output:
// value :>>  1
// value :>>  2
// value :>>  3

asnyc await 其实就是 Generator 的语法糖,只不过内置一个执行器,其返回值是一个 Promise 对象。

function* gen() {
  let a = yield Promise.resolve(1);
  let b = yield Promise.resolve(2);
  return 'end';
}

function run() {
  return new Promise((res, rej) => {
    try {
      const g = a();

      function next(data) {
        let n = g.next(data);
        if (n.done) return res(n.value);
        Promise.resolve(n.value).then(next, g.throw);
      }

      next();
    } catch (error) {
      rej(error);
    }
  });
}

run(gen);
posted @   梦渊同学  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示