生成函式
阿新 • • 發佈:2020-09-03
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(); debuggerreturn 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