ES6 generator 函式詳解

2021-09-10 01:30:25 字數 1672 閱讀 5372

generator是es6的新特性,通過yield關鍵字,可以讓函式的執行流掛起,那麼便為改變執行流程提供了可能。

function * main()
使用以上語法就可以宣告乙個generator,注意main是乙個函式

判斷是否為generator

function isgen(fn)
generator的構造器

main.constructor //function generatorfunction()
var g= main();

console.info(typeof g)

g是generator object,在mdn上稱為generator-iterator

next

雖然main被呼叫了,但是並沒有執行裡面的方法體,而是返回了乙個generator object,如何呼叫裡面的方法體呢,這就要使用next方法

console.log(g.next());//
next方法會執行函式體,直到遇到第乙個yield語句,然後掛起函式執行,等待後續呼叫。但是next會返回乙個物件,這個物件有2個key,value表示yield語句後面的表示式的值('hello'),done是個布林值,表示函式體是否已經執行結束。再次呼叫g。next時,執行流在掛起的地方繼續執行,直到遇到第2個yield,依次類推。

console.log(g.next());//

console.log(g.next());//

console.log(g.next());//

tips:有時候我們把yield看成是return

next方法也接受傳參,傳入引數作為yield語句的返回值;

function *main() 

var g=main();

g.next();

g.next("hello world") //hello world

next方法的特性很總要,很多基於generator做的流程控制都基於這個特性。

function * main()

var m=main()

m.next()

m.next() //uncaught referenceerror: a is not defined

我們可以使用catch捕獲異常

function* a() 

function* b()

function* c()

var cc = c();

cc.next(); //

cc.next(); //

cc.next(); //

cc.next(); //

cc.next(); //

cc.next(); //

cc.next(); //

cc.next(); //

function * g () );

}var g = g();

console.log(g.next());

"hi"));

//hi

//

ES6 Generator 生成器 函式

es6 新引入了 generator 函式,可以通過 yield 關鍵字,把函式的執行流掛起,為改變執行流程提供了可能,從而為非同步程式設計提供解決方案。基本用法 generator 有兩個區分於普通函式的部分 其中 用來表示函式為 generator 函式,yield 用來定義函式內部的狀態。fu...

ES6 Generator函式的非同步應用

多個執行緒互相協作,完成非同步任務。yield命令表示執行到此處,執行權將交給其他協程,也就是說,yield命令是非同步兩個階段的分界線。協程遇到yield命令就暫停,等到執行權返回,再從暫停的地方繼續往後執行。function asyncjob function gen x var g gen 1...

es6 generator函式的非同步程式設計

es6 generator函式,我們都知道asycn和await是generator函式的語法糖,那麼genertaor怎麼樣才能實現asycn和await的功能呢?1.thunk函式 將函式替換成乙個只接受 函式作為引數的單引數函式 thunk 函式替換的不是表示式,而是多引數函式,將其替換成乙個...