源码分析完了,我们可以把co串行调用generator函数中yield的过程总结如下:
进入外围Promise通过入口onFilfilled()方法,将generator函数运行至第一个yield处,执行该yield后边的异步操作,并将结果传入next方法如果next中传入结果的done为true,则返回外围Promise的resolve如果next中传入结果的done为true,则返回value(即yield后边的对象)是否可以转化为内部Promise对象。如无法转化,则抛出错误,返回外围Promise的reject若能转化为Promise对象,将所有内部Promise并行执行,通过then(onFilfilled, onRejected)开始执行在onFilfilled()或者onRejected()内部调用再次调用next()方法,实现串行执行yield,并肩yield后边的对象传递给next(),依次重复。所有yield执行返回,将最后的return值返回给外围Promise的resovle方法,结束co对generator函数的调用
yield后面对象转化为Promise
能够在co中实现generator函数的逐步调用next()方法,转化为内部Promise将至关重要,而源码是如何转化的呢?哪些对象又是能够转化的呢?接下来,我们看下源码。