1. 程式人生 > 實用技巧 >10-ES6之Generator 函式

10-ES6之Generator 函式

ES6 新引入了 Generator 函式,可以通過 yield 關鍵字,把函式的執行流掛起,為改變執行流程提供了可能,從而為非同步程式設計提供解決方案。 基本用法

Generator 函式組成

Generator 有兩個區分於普通函式的部分:

  • 一是在 function 後面,函式名之前有個 * ;

  • 函式內部有 yield 表示式。

其中 * 用來表示函式為 Generator 函式,yield 用來定義函式內部的狀態。

執行機制

呼叫 Generator 函式和呼叫普通函式一樣,在函式名後面加上()即可,但是 Generator 函式不會像普通函式一樣立即執行,

而是返回一個指向內部狀態物件的指標,所以要呼叫遍歷器物件Iterator 的 next 方法,指標就會從函式頭部或者上一次停下來的地方開始執行。

函式返回的遍歷器物件的方法

next 方法

一般情況下,next 方法不傳入引數的時候,yield 表示式的返回值是 undefined 。當 next 傳入引數的時候,該引數會作為上一步yield的返回值。

遍歷器物件丟擲了兩個錯誤,第一個被 Generator 函式內部捕獲,第二個因為函式體內部的catch 函式已經執行過了,不會再捕獲這個錯誤,所以這個錯誤就丟擲 Generator 函式體,被函式體外的 catch 捕獲。

yield*表示式

yield* 表示式表示 yield 返回一個遍歷器物件,用於在 Generator 函式內部,呼叫另一個 Generator 函式。

 <script>
        //generator函式,可以通過yield關鍵字,將函式掛起,為了改變執行流,提供了方法,提供非同步執行
        //它和普通函式的區別
        //1.function後面,函式名之前有個*
        //2.只能在函式內部使用yeild表示式,讓函式掛起

        function* func(a){
            yield 2;
            yield 3;
        }
        let fn=func();
        console.log(fn.next())
        console.log(fn.next())
        console.log(fn.next())
        //{value: 2, done: false}
        //{value: 3, done: false}
        //{value: undefined, done: true}

        //總結:generator函式是分段執行的,yeild語句是暫停自毀長城 ,而next()恢復執行

        //傳值
        function * add(){
            console.log("one");
            //x可真的不是yeild‘2’的返回值,他是next()呼叫,恢復當前yeild返回值
            let x =yield '2';
            console.log("one:"+x);
            let y = yield '3';
            console.log("two"+y);
            return x+y;
        }

        const fn2 =add()
        //函式執行
        console.log(fn2.next());//{value: "2", done: false}
        //第一次yeild被喚醒
        console.log(fn2.next(10));//{value: "3", done: false}
        //第二次yeild被喚醒
        console.log(fn2.next(20));//{value: 30, done: true}


        
    </script>