![](/img/trans.png)
[英]Pros/cons of using redux-saga with ES6 generators vs redux-thunk with ES2017 async/await
[英]Why does ES2017 introduce async/await when ES6 already has generators?
當閱讀關於async
和await
,我注意到它幾乎相當於生成器函數。 考慮來自TypeScript Deep Dive的這個片段 :
異步等待
(......)
// Not actual code. A thought experiment async function foo() { try { var val = await getMeAPromise(); console.log(val); } catch(err) { console.log('Error: ', err.message); } }
(......)
生成的JavaScript
你不必理解這一點,但如果你已經閱讀了生成器,那就相當簡單了。 函數
foo
可以簡單地包裝如下:const foo = wrapToReturnPromise(function* () { try { var val = yield getMeAPromise(); console.log(val); } catch(err) { console.log('Error: ', err.message); } });
其中
wrapToReturnPromise
只是執行生成函數來獲取generator
,然后使用generator.next()
如果該值是一個promise
它會then
+catch
的承諾,根據結果調用genertor.next(result)
或genertor.throw(error)
。 而已!
它最終成為“新功能”的原因是什么? 恕我直言,只是使用某些庫中的wrapToReturnPromise
函數同樣好,而不會導致JavaScript本身的復雜性。
注意:它與這個問題有關 ,但在這里我問的是“為什么”,而不是“如何”。 我試着理解動機。
乍一看,語法類似,您可能會認為代碼的行為類似 - 但有一些關鍵的區別:
說出你的意思 : function*
和yield
意味着與async function
和await
很大不同,類似於Subclass.prototype = Object.create(Superclass.prototype); Subclass.prototype.constructor = Subclass
Subclass.prototype = Object.create(Superclass.prototype); Subclass.prototype.constructor = Subclass
不同於class Subclass extends Superclass
運算符優先級 :您可以await a + await b
表示(await a) + (await b)
,但是yield a + yield b
意味着yield (a + (yield b))
未來的發展 : async/await
通過樂觀的事務鎖定和推測執行為一些非常有趣的工作鋪平了道路,因為它們(如本線程所述)是原子性邊界的顯式標記
其他論點 : async/await
還有許多反向參數 - 包括很多人說發電機只是'更好'而async/await
正朝着錯誤的方向發展。
從ES討論網站無恥地總結。 我鼓勵你閱讀整個主題,因為它有一些關於這個主題的非常有趣的討論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.