JS中的Generator 筆記

2021-10-09 01:47:38 字數 2593 閱讀 4678

語法上,首先可以把它理解成,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,用來生成乙個等差數列的陣列,然後我們可以用...