10-ES6之Generator 函式
阿新 • • 發佈:2020-09-12
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>