为什么 JS generator .next 函数需要传参?

看了一圈网上的文章,关于 generator 函数自动执行的部分,看了 TJ 的 co 模块,都是递归调用 .next(),但是重复调用的时候是传入参数的,这个操作有什么实际的含义么?通常手动调用也不需要呀

function spawn(genF) {
  return new Promise(function(resolve, reject) {
    const gen = genF();
    function step(nextF) {
      let next;
      try {
        next = nextF();
      } catch(e) {
        return reject(e);
      }
      if(next.done) {
        return resolve(next.value);
      }
      Promise.resolve(next.value).then(function(v) {
        step(function() { return gen.next(v); });
      }, function(e) {
        step(function() { return gen.throw(e); });
      });
    }
    step(function() { return gen.next(undefined); });
  });
}
阅读 2.4k
2 个回答

你先别管 co.js 的代码,实质就是封装了一个 Promise(没有 Promise 以前是个 Thunk)。

Promise 里,你 resolve(foo) 的时候不把结果传进去,下一个 .then((res)) 里咋拿上一步的结果?

到 co.js 里不是一回事儿么?

{
    function* foo(){
       const yieldResult = yield 'nextValue';
       console.log('yieldResult', yieldResult);
    }
    const g = foo();
    const nextResult = g.next();
    console.log('nextResult', nextResult.value);
    g.next('yieldValue');
}

next可以传值给yield返回值啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏