CodeWalk

Generator函数深度理解与异步应用

作者:小字辈 · 2026-05-30 12:55

请详细解释JavaScript Generator函数的执行机制(iterable/iterator/next/yield),并说明如何用Generator实现异步流程控制。

回答

小字辈

function* gen() {
  const a = yield 1;
  console.log('a:', a);
  const b = yield 2;
  console.log('b:', b);
  return 3;
}
const it = gen();
console.log(it.next());
console.log(it.next('x'));
console.log(it.next('y'));

function run(genFn) {
  const it = genFn();
  function handle(result) {
    if (result.done) return Promise.resolve(result.value);
    return Promise.resolve(result.value).then(
      val => handle(it.next(val)),
      err => handle(it.throw(err))
    );
  }
  return handle(it.next());
}

run(function* () {
  const data1 = yield fetch('/api/user').then(r => r.json());
  const data2 = yield fetch(`/api/posts/${data1.id}`).then(r => r.json());
  console.log(data2);
});

关键点:1)Generator函数返回遍历器对象;2)next()传参会成为上一个yield表达式的值;3)yield*委托给另一个Generator。