語法上,首先可以把它理解成,generator 函式是乙個狀態機,封裝了多個內部狀態。
執行 generator 函式會返回乙個遍歷器物件,也就是說,generator 函式除了狀態機,還是乙個遍歷器物件生成函式。返回的遍歷器物件,可以依次遍歷 generator 函式內部的每乙個狀態。
generator 函式是分段執行的,yield表示式是暫停執行的標記,而next方法可以恢復執行
普通函式就像是做飛機,直接到站,中間不能停車,
但是generator就像是咱們自己開著車出去玩,想啥時候停啥時候挺,想啥時候走就啥時候走
實現步驟
// function關鍵字與函式名之間有乙個星號
function
*生成器函式名()
yield表示式
遇到yield表示式,就暫停執行後面的操作,並將緊跟在yield後面的那個表示式的值,作為返回的物件的value屬性值。
下一次呼叫next方法時,再繼續往下執行,直到遇到下乙個yield表示式。
如果沒有再遇到新的yield表示式,就一直執行到函式結束,直到return語句為止,並將return語句後面的表示式的值,作為返回的物件的value屬性值。
如果該函式沒有return語句,則返回的物件的value屬性值為undefined。
function
*helloworldgenerator()
var hw =
helloworldgenerator()
;hw.
next()
// 第一次執行
// hw.
next()
// 第二次執行
// hw.
next()
// 第三次執行
// hw.
next()
// 第四次執行
//
yield表示式本身沒有返回值,或者說總是返回undefined。next方法可以帶乙個引數,該引數就會被當作上乙個yield表示式的返回值。
function*f
()}}
var g =f(
);g.next()
// g.
next()
// g.
next
(true
)//
定義了乙個可以無限執行的 generator 函式f,如果next方法沒有引數,每次執行到yield表示式,變數reset的值總是undefined。當next方法帶乙個引數true時,變數reset就被重置為這個引數(即true),因此i會等於-1,下一輪迴圈就會從-1開始遞增。
generator.prototype.throw()方法
generator 函式返回的遍歷器物件,都有乙個throw方法,可以在函式體外丟擲錯誤,然後在 generator 函式體內捕獲。
varg=
function*(
)catch(e
)};var i =g(
);i.next()
;try
catch(e
)// 內部捕獲 a
// 外部捕獲 b
throw方法可以接受乙個引數,該引數會被catch語句接收,建議丟擲error物件的例項。
generator.prototype.return()
generator 函式返回的遍歷器物件,還有乙個return方法,可以返回給定的值,並且終結遍歷 generator 函式。
function
*gen()
var g =
gen();
g.next()
// g.
return
('foo'
)//
g.next()
//
next()、throw()、return()這三個方法本質上是同一件事,可以放在一起理解。它們的作用都是讓 generator 函式恢復執行,並且使用不同的語句替換yield表示式。
next()是將yield表示式替換成乙個值。
throw()是將yield表示式替換成乙個throw語句。
return()是將yield表示式替換成乙個return語句。
如果在 generator 函式內部,呼叫另乙個 generator 函式。需要在前者的函式體內部,自己手動完成遍歷
es6 提供了yield*表示式,作為解決辦法,用來在乙個 generator 函式裡面執行另乙個 generator 函式。
function
*bar()
// 等同於
function
*bar()
// 等同於
function
*bar()
yield
'y';
}for
(let v of
bar())
// "x"
// "a"
// "b"
// "y"
JS非同步程式設計之Generator
前言 es6 中提出乙個叫生成器 generator 的概念,執行生成器函式,會返回迭代器物件 iterator 這個迭代器物件可以遍歷函式內部的每乙個狀態。function helloworldgenerator 通過執行生成器返回迭代器物件 var helloworlditerator hell...
hibernate中generator屬性的意義
1 identity 用於mysql資料庫。特點 遞增 注 對於mysql資料庫使用遞增序列時需要在建表時對主鍵指定為auto increment屬性。2 sequence 用於oracle資料庫 序列名3 native 跨資料庫時使用,由底層方言產生。default.sequence為hibern...
Php中的Generator如何使用?
何為 generator 從 php 5.5 開始,php 加入了乙個新的特性,那就是generator,中文譯為生成器。生成器可以簡單地用來實現物件的迭代,讓我們先從官方的乙個小例子說起。xrange 在 php 中,我們都知道,有乙個函式叫做range,用來生成乙個等差數列的陣列,然後我們可以用...