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是一款全新的車款,...