Js的generator函数怎么实现异步?

这不是一个生成器吗?怎么实现异步,看不懂。

阅读 2.3k
2 个回答

单纯的Generator函数并不能实现异步的功能。但这个玩意好在能暂停执行代码,即一次的yield语句暂停一次。那这样就好了,只要在某一个异步的操作没完成之前,不调用yield就行了。一旦异步操作完成,那么进行下一个yield
那问题来了,如何判断异步操作的状态呢?所以要完成用Generator函数异步控制,还需要两个条件,一是每次yield表达式返回一个Promise对象,二是一个执行器。这个执行器一个例子就是大名鼎鼎的co模块了。

例子

function* gen(){
     // asycnFunction函数返回一个Promise对象
     yield asycnFunction1()
     // asycnFunction1函数在没有resolve之前,不会进行下一步
     yield asycnFunction2()
}
执行
const co = require('co')
co(gen)

打个不恰当的比方,把你用到.next()函数的环境看作是一个线程,把generator函数看做是另一个线程。在用.next()函数的时候是执行generator函数中的代码,相当于把执行权交给了generator函数。然后generator函数执行到yield命令或者是return亦或者执行完了的时候返回使用.next()函数的环境,相当于返还执行权。是这样实现异步的。其实我感觉上有点像同步。这里有个教程,不知你是否看过:http://es6.ruanyifeng.com/#do...

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