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);
結論
如果一個函數中包含異步操作,因爲不確定什麼時候會拿到值,所以就直接傳遞一個函數接收結果,並在適當的時候調用這個函數,然後並對結果進行處理就可以了。