// run (async) a generator to completion
// Note: simplified approach: no error handling here
function runGenerator(g) {
var it = g(), ret;
// asynchronously iterate over generator
(function iterate(val){
ret = it.next( val );
if (!ret.done) {
// poor man's "is it a promise?" test
if (typeof ret.value.then === 'function') {
// wait on the promise
ret.value.then( iterate );
}
// immediate value: just send right back in
else {
// avoid synchronous recursion
setTimeout( function(){
iterate( ret.value );
}, 0 );
}
}
})();
}
function *foo() {
var z = yield 3;
console.log(z);
var w = yield 4;
console.log(w);
}
function *bar() {
var x = yield 1;
console.log(x);
var y = yield 2;
console.log(y);
yield *foo();
var v = yield 5;
console.log(v);
}
runGenerator(bar);
4 篇关于 Generator 的文章,从入门到放弃(CSP),里面有几个重要的点:
1. 使用
yield
和return
导致for...of
结果的不同2.
next()
可以传值3. 在 Generator 嵌套 Generator 的顺序是怎样的?
当前迭代器会代理嵌套 Generator 的迭代器,流程如下:
*bar()
的迭代器走到yield *foo()
的点,进入*foo()
完成迭代,再跳出来往下执行。4. 知名 Node.js 库 tj/co 的实现原理
基本上就是自执行 Generator 和 Promise 结合的结果。