// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Iterators_and_Generators
// 这里生成器的next有两个作用,一个next一个返回上次的结果值
// 这里不添加动态作用域,直接使用函数式做法..,但是会引入一点副作用。
function yieldRun(generator) {
/// js解释器 ---> ast
var iterator = generator();
run(iterator, undefined);
//
}
function run(it, lastValue) {
var result = it.next(lastValue);
if (result.done) {
return;
}
Promise.resolve(result.value).then(function(res) {
run(it, res);
});
}
function* g() {
var a = 1;
var b = yield 2;
console.log(222);
var c = yield a + b;
console.log(c);
var d = yield new Promise(function(resolve) {
setTimeout(resolve, 1000, 18);
}).then(function(res){
console.log(res);
return 23;
});
console.log(d)
var e = yield 56;
}
function yieldRun2(generator) {
var iterator = generator();
run2(iterator, undefined);
}
function run2(it, lastValue) {
// next 一个返回值用于给当前的var= 等号前的变量赋值。
var result = it.next(lastValue);
if (result.done) {
return;
}
var temp = result.value;
if (typeof temp === 'function') {
temp(function(v) {
run2(it, v);
})
} else {
run2(it, temp);
}
}
function *g2() {
var c = 1000;
console.log(1);
var a = yield function(fn) {
setTimeout(function() {
fn(1000);
}, 1000)
}
console.log(a);
}
yieldRun(g)
console