1. 程式人生 > 實用技巧 >生成函式

生成函式

1、定義

function * 函式名{
  let obj = yield "生成器函式" 
}

與普通函式的區別:

  1、function後面加了*

  2、函式體裡有 yield關鍵字

2、表現

  1、呼叫這個函式,不會立即執行函式體裡的內容,返回一個物件

  2、通過這個物件的next方法,可以驅動函式的執行,但是並不會執行完,執行到下一個yield關鍵字的時候,停住

  3、呼叫next()方法返回的結果

    • value: yield關鍵字後面的表示式的內容。
    • done:函式是否執行完,執行完返回true,未執行完返回false。 (當生成函式return的執行完,函式執行結束,返回true)
    • 函式return的時候,value是return語句的內容,done是true

  4、next()方法可以加引數

    • next(引數)
    • 這個引數會作為上一個yield關鍵字的返回值

3、作用

  1、生成函式可以返回多個值

  2、在呼叫函式之後,可以給函式體裡傳遞資料

  3、呼叫函式的時候,可以控制函式內部的執行

  4、可以解決非同步問題

4、生成函式執行器

// 寫一個生成函式的執行器
        function run(gen) {
            // 編寫一段遞迴呼叫來執行我們的程式碼
            let lt = gen();
            debugger
            
return new Promise((reslove, reject) => { // {value,done} function step(data) { if (data.done) { console.log("遞迴呼叫結束了"); reslove(data.value) } else { data.value.then(res
=> { step(lt.next(res)) }) } } step(lt.next()) }) }

5、yield

  yield在生成函式中起到了十分重要的作用,就相當於暫停執行並且返回資訊。return代表的是終止執行,yield代表的是暫停執行,後續通過呼叫生成器的next()方法,可以恢復執行。

  在一個Generator函式裡面,如果我們想呼叫另一個Generator函式,就需要用到的關鍵字是:yield*。

function* gen1(){
    yield "gen1 start";
    yield "gen1 end";
 
}
 
function* start(){
    yield "start";
    yield* gen1();
    yield "end";
}
 
var ite1 = start();
console.log(ite1.next());//start
console.log(ite1.next());//gen1 start
 
console.log(ite1.next());//gen1 end
console.log(ite1.next());//end
console.log(ite1.next());//undefined