function co(GenFunc) {
return function(cb) {
var gen = GenFunc()
next()
function next() {
if (gen.next) {
var ret = gen.next()
if (ret.done) { // 如果结束就执行cb
cb && cb()
} else { // 继续next
ret.value(next)
}
}
}
}
}
初学koa,tj大神的co库核心代码如上,我很难理解ret.value(next) 它只是把next函数体传给了ret对象的value属性,怎么就可以再次执行next()呢(我的理解是整个函数只执行了一次gen.next(),没有递归)请大家答疑解惑,不胜感激!
我前几天写过一篇关于koa中间件原理的文章,希望能帮到你理解一点点generator探幽(1)--koa中间件机制浅析
(ps:koa里next的实现其实不是co,是一个叫compose的这么个函数)