如何将generator函数转为类async函数?
我们先来想想generator和async有什么区别?
唯一的区别就是async会自动执行,而generator每次都要调用next函数。
所以问题变为,如何让generator自动执行next函数?
回忆一下generator的知识:每次执行generator的next函数时,它会返回一个对象:
1 | { value: xxx, done: false } |
返回这个对象后,如果能再次执行next,就可以达到自动执行的目的了。
看下面的例子:
1 | function * gen(){ |
此时ret = { value: Promise实例; done: false};
value已经拿到了Promise对象
,那就可以自己定义成功/失败
的回调函数了。如:
1 | ret.value.then(g.next) |
现在就大功告成啦。我们只要找到一个合适的方法让g.next()一直持续下去
就可以自动执行了。
所以问题的关键在于yield的value必须是一个Promise
。那么我们来看看co
是如何把这些东西都转化为Promise
的:
1 | function co(gen) { |
本文只作为我学习的一个笔记,这是该文的出处:可能是目前最全的koa源码解析指南。