generator是es6提供的一種非同步程式設計的解決方案。
形式上有兩個特徵。一是,function
關鍵字和函式名之間有個星號;二是,函式內部使用yield
語句,定義不同的內部狀態。
function* hellogenerator
()var hw = hellogenerator();
必須呼叫物件的next
方法,使得指標移向下乙個狀態。generator
函式是分段執行的。yield
語句是暫停執行的標記,而next
方法可以恢復執行。
hw.next()
// hw.next()
// hw.next()
// hw.next()
//
遍歷器物件的next
方法的執行邏輯如下:
(1)遇到yield
語句,就暫停執行後面的操作,並將緊更著yield
後面表示式的值,作為返回的物件value
的屬性值。
(2)下次呼叫next方法時,再繼續往下執行,直到遇到下乙個yield
語句的。
(3)如果沒有遇到新的yield
語句,就一直執行到函式結束,直到return
語句為止,並將return
語句後面的表示式的值,作為返回的物件的value
值。
(4)如果該函式沒有return
語句,則返回的物件的value
屬性值為undefined
。
generator函式可以不用yield語句,這時就變成乙個單純的暫緩執行函式。
function* f
()var generator = f();
settimeout(function
(),2000);
上面**如果f
是普通函式,再為變數generator
賦值的時候就已經執行了。但是,函式f
是乙個generator
函式,就變成只有呼叫next
方法時,函式f
才會執行。
另外注意,yield
語句不能再普通函式裡面,否則會報錯。
return
方法可以返回指定的值,並終結了generator
函式。
function* gen()
var g = gen();
g.next(); //
g.return('foo'); //
g.next(); //
如果generator
函式內部有try ... finally
**塊,那麼return
方法會推遲到finally
**塊執行完成再執行。
function* numbers() finally
yield6;}
var g = numbers()
g.next(); //
g.next(); //
g.return(7);//
g.next();//
g.next();//
ES6學習系列 Generator 函式
generator 總覽 上例項 function testgen let test testgen test.next test.next test.next test.next 遍歷到這裡就結束了 test.next 1 generator 函式返回的遍歷器物件和 iterator 介面的關係 ...
ES6 學習系列十六(Generator)
generator可以理解為非同步程式設計的一種解決方案。1 generator的基本定義就是在function後面加乙個 符號 通過next一步步執行yield的 let k tell console.log k.next console.log k.next console.log k.next...
聊聊ES6中的generator
generator generator 生成器 是es6標準引入的新的資料型別。乙個generator看上去像乙個函式,但函式執行中間可以停止。es6定義generator標準的哥們借鑑了python的generator的概念和語法。話說回來,generator有什麼用呢,讓我們通過幾個函式來看一看...