用co库,yield 后面是否一定要返回一个 promise?

function* gen() {
   const res = yield some();
   return res;
}

co(gen);

如上,some方法是否一定要返回一个Promise?

如果返回Promise,那么res为什么能得到数值而不是Promise实例?

阅读 3.4k
2 个回答

是的。因为 yield 后面语句的返回值,是做为 generator.next(data) 的返回值,而传入的参数 data 才是作为 yield 语句的返回值,这样设定才实现的协程的效果。通过 next 函数返回一个 Promise 对象,执行器(这里是 Co 模块)才能实现自动执行 generator 函数。大致思想如下:

var g = gen() 
// g.next() 执行了 yield 后面语句,并返回 Promise 对象
g.next().then(function (data) {
    // 将异步数据传入 next 函数,作为 yield 语句的返回值
    g.next(data)
})

详细信息可以看看阮一峰老师的 Es6 教程和 Co 执行器的源代码

一句话,必须的。

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