es6 Generator Thunk函數實現自動執行

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);

這裏寫圖片描述

結論

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章