async、await 優缺點
async
和await
相比直接使用Promise
來說,優勢在於處理 then 的調用鏈,能夠更清晰准確的寫出代碼。缺點在於濫用await
可能會導致性能問題,因為await
會阻塞代碼,也許之后的異步代碼並不依賴於前者,但仍然需要等待前者完成,導致代碼失去了並發性
下面來看一個使用 await
的代碼。
- 首先函數
b
先執行,在執行到await 10
之前變量a
還是0
,因為在await
內部實現了generators
,generators
會保留堆棧中東西,所以這時候a = 0
被保存了下來- 因為
await
是異步操作,遇到await
就會立即返回一個pending
狀態的Promise
對象,暫時返回執行代碼的控制權,使得函數外的代碼得以繼續執行,所以會先執行console.log('1', a)
- 這時候同步代碼執行完畢,開始執行異步代碼,將保存下來的值拿出來使用,這時候
a = 10
- 然后后面就是常規執行代碼了