有关 Generator 的自动执行器问题?

阮一峰 ES6 教程里的例子,我知道自动执行器里的 next 函数会作为回调函数传入 Thunk 函数返回的函数里,一直递归调用,可是 err, data 这种参数形式只能适用于操作 fs.readFile,如果我要操作其他函数就失效了,总不能为每个操作都写个自动执行器吧,co 模块又是怎么解决这个问题的呢。

function run(fn) {
  var gen = fn();

  function next(err, data) {
    var result = gen.next(data);
    if (result.done) return;
    result.value(next);
  }

  next();
}

function* g() {
  // ...
}

run(g);

fs.readFile(fileName, (err,data) => {});
阅读 1.5k
1 个回答

(err, data) 形式并不是 fs.readFile 专属,这是一种 thunks (functions) 的 callback 传参, co 库也仅支持这一类(特指普通函数,co 当然也支持 yield promise 之类的)。

当然,理论上来说,yield 操作的适用对象是有限定的,基本也逃脱不了 co 支持的类型:

  • promises
  • thunks (functions)
  • array (parallel execution)
  • objects (parallel execution)
  • generators (delegation)
  • generator functions (delegation)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题