ES6 中的Generator 函式有何特別之處?

時間 2021-05-12 00:00:31

1樓:

個人是這麼理解和記憶的。

迭代器(Iterator)的出現,是為了便於遍歷新出現的資料結構,如Map/Weakmap/Set相較於之前的Object/Array,及自定義的資料結構:

function makeIterator(array)

}並且,乙個資料的結構體如果是可迭代的(Iterable),比如自帶這個功能的陣列(不帶的要自己實現),則可以用for of來迴圈:

for(let i of [1,2,3])

那麼,非同步迭代器(Async Iterator)則用來遍歷非同步資料結構(Promises/Node@v10 Stream)。跟普通的迭代器差別是,可配合for await of來拍平(flatMap)它而獲取裡面的內容,這裡的用法很類似之前的yield * gen():

async function example() ,…

}}至於非同步生成器(Async Generator),顧名思義是用來建立屬於你自己的非同步資料流,跟上面的生成器一樣也可以當成工廠函式:

}其它的么兒子用法,我也沒太深究過。感覺用借助一些執行器的庫(co),讓生成器實現非同步處理有點繞(koa@v1/redux-saga)。

複雜非同步流控不都上Observer? PS. 聽說Iterator/Generator可用來配合實現Observer @Rx.js?

PPS. 合理利用Generator,不僅可以用來做狀態機,其暫停函式的特性或者說惰性求值(lazy evaluation),可以實現乙個無限序列(infinite range),也能實現個排程器…

2樓:Friday

作為非同步解決方案來看,從效能來說async/await很明顯優於generator,可以用benchmark測試一下,async/await的呼叫棧也更加清晰,相比之下generator函式一般用co作為執行器呼叫,呼叫棧會更深。

3樓:賀師俊

『Generator 函式最開始被用來作為非同步解決方案,但是在 async/await 進入標準後逐漸被邊緣化了。』——題主這個論述本身就是錯誤的。

『或者兩個就是完全不同層面的東西....』——是的。

generator本身是用來實現iterator的。建議題主找個入門文章或書讀一下。比如迭代器和生成器。高階可以讀 http://

。被用於非同步只是乙個偏門用途,所以在有async/await之後自然就沒必要再用generator來做非同步了。何況js現在還引入了async iterator/generator。

如何理解ES6的yield ?

roscoe 我怎麼覺得Generator函式改為叫Ratchet函式會更形象些yield就是棘輪的停止,next 的執行就是棘輪的下一次的執行,狀態往復直至done的狀態為true而止。 已重置 當我們寫乙個函式在function後面或者函式名字前面加上乙個 呼叫這個函式返回的就是Generato...

es6中class類繼承的super我可以理解為是父類的例項麼

Tianfan 執行過程,是把 this 這個物件,放進 super 進行包裝後返回到 this 上。其實 this 也是函式的引數,你就能理解了。 謝然 super不是父類的例項,只是乙個為了你方便訪問到父類函式 包括建構函式 的關鍵字 而且即使發生了繼承,也只有乙個物件例項被建立可以看一下我這邊...

如何評價蔚來 ES6?

1217 蔚來es6,我親戚有一台,剛買的,開回老家的時候,不少老頭小孩圍過來看,都認為這台車不簡單。怎麼說那,空有車殼,也不對,所以我問了一下我的親戚感受。還是那句話,看起來是真的帥啊,充滿未來感,要不怎麼叫蔚來嘞。裸車售價在35.80 54.80萬元之間。說實話不便宜哦。ES6是一款全新的車款,...