function *gen(){
var res = yield 1+2;
yield 2+3;
yield 3+4;
}
var genFun = gen();
执行流程:
1、var result = genFun.next(); 只是将 yield后面的代码执行一下,返回到result中,这个时候还没有res什么事情呢。
2、再次调用genFun.next(param);然后才会将param赋值给res;并接着往下执行到2+3 这个表达式,然后又把这个结果传递出来。
*
generator函数中没有异步的自动执行函数
function run(genFun){
this.next = function(data){
var result = genFun.next();
console.log("yield后面的表达式值是:",result.value);
if(value.done) return;//如果执行完毕了,就return;
next();//否则就再次调用next来取下一个value;
}
next();
}
var gen = genFun();
run(gen);
执行结果:
generator函数中包括异步操作的自动执行函数
function *genFun(){
let result = yield function(fun){
setTimeout(fun({result:"data"}),1000);
}
console.log("异步操作的结果是:",result);
}
function run(genFun){
this.next = function(data){
let result = genFun.next(data);
console.log("result value is ",result.value);//这里可以发现其实value是一个function,所以下面可以直接调用value();
if(result.done) return;
result.value(this.next);
};
next();
}
var gen = genFun();
run(gen);
结论
如果一个函数中包含异步操作,因为不确定什么时候会拿到值,所以就直接传递一个函数接收结果,并在适当的时候调用这个函数,然后并对结果进行处理就可以了。