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 函式替換的不是表示式,而是多引數函式,將其替換成乙個...