簡體   English   中英

當ES6已經有生成器時,為什么ES2017會引入async / await?

[英]Why does ES2017 introduce async/await when ES6 already has generators?

當閱讀關於asyncawait ,我注意到它幾乎相當於生成器函數。 考慮來自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 functionawait很大不同,類似於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM