av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

JS異步堆棧追蹤之為什么await勝過Promise

瀏覽:78日期:2024-03-31 11:06:06
概述

async/await和Promise的根本區(qū)別在于await fn()暫停當(dāng)前函數(shù)的執(zhí)行,而promise.then(fn)在將fn調(diào)用添加到回調(diào)鏈后,繼續(xù)執(zhí)行當(dāng)前函數(shù)。

const fn = () => console.log(’hello’)const a = async () => { await fn() // 暫停 fn 的執(zhí)行}// 調(diào)用 a 時,才恢復(fù) fn 的執(zhí)行a() // 'hello'const promise = Promise.resolve()// 將 fn 添加到回調(diào)鏈后,繼續(xù)執(zhí)行 fnpromise.then(fn) // 'hello'

在堆棧追蹤的上下文中,這種差異非常顯著。

當(dāng)一個Promise鏈(無論是否脫糖化)在任何時候拋出一個未經(jīng)處理的異常時,JavaScript引擎都會顯示一條錯誤信息和(希望)記錄一個有用的堆棧追蹤。

作為一名開發(fā)人員,無論您使用的是普通的Promise還是async await,您都會期望這樣。

Promise

想象一個場景,當(dāng)對異步函數(shù)b的調(diào)用解析時,調(diào)用函數(shù)c:

const b = () => Promise.resolve()const a = () => { b().then(() => c())}

當(dāng)調(diào)用a時,將同步發(fā)生以下情況:

b被調(diào)用并返回一個Promise,該Promise將在將來某個時刻解決。 .then回調(diào)(實際上是調(diào)用c())被添加到回調(diào)鏈中( V8 術(shù)語中,[…]被添加為解析處理程序)。

之后,我們完成了在函數(shù)a的主體中執(zhí)行代碼。a永遠(yuǎn)不會被掛起,當(dāng)對b的異步調(diào)用解析時,上下文已經(jīng)消失了。

想象一下如果b(或c)異步拋出異常會發(fā)生什么?理想情況下,堆棧追蹤應(yīng)該包括a,因為b(或c)是從那里調(diào)用的,對吧?既然我們不在參考a了 ,那怎樣能做到呢?

為了讓它工作,JavaScript 引擎需要在上面的步驟之外做一些事情:它在有機(jī)會的時候捕獲并存儲堆棧追蹤。

在V8中,堆棧追蹤附加到b返回的Promise。當(dāng)Promise實現(xiàn)時,堆棧追蹤將被傳遞,以便c可以根據(jù)需要使用它。

b()[a] -> b().then()[a] -> c[a?:a]

捕獲堆棧追蹤需要時間(即降低性能);存儲這些堆棧追蹤需要內(nèi)存。

async/await

下面是同樣的程序,使用async/await而不是Promise編寫:

const b = () => Promise.resolve()const a = async () => { await b() c()}

使用await,即使在await調(diào)用中不收集堆棧追蹤,我們也可以恢復(fù)調(diào)用鏈。

這是可能的,因為a被掛起,正在等待b解決。如果b拋出異常,則可以按需以這種方式重建堆棧追蹤。

如果c拋出異常,堆棧追蹤可以像同步函數(shù)那樣構(gòu)造,因為發(fā)生這種情況時,我們?nèi)栽赼上下文中。

通過遵循以下建議,使 JavaScript 引擎能夠以更高效的方式處理堆棧追蹤:

偏好async/await勝過Promise。 使用 @babel/preset env避免不必要的async/await傳輸。

以上就是JS異步堆棧追蹤之為什么await勝過Promise的詳細(xì)內(nèi)容,更多關(guān)于Javascript的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 日本欧美国产在线观看 | 久久久久香蕉视频 | 中文字幕高清av | 成人精品一区二区三区中文字幕 | 这里有精品 | 久久精品天堂 | 青青久草 | 久久av一区二区三区 | 草b视频| 日本精品一区二区三区在线观看 | 成人毛片在线视频 | 亚洲欧美国产精品一区二区 | 国产一区二区三区视频 | 91av视频在线观看 | 亚洲成人一区二区三区 | 成人激情视频免费观看 | 在线成人av| 久久精品二区 | 国产www成人 | 欧美一级二级三级 | 国产精品久久一区二区三区 | 午夜大片| 精品国产一区二区三区久久 | 看片91| 国产欧美日韩一区 | 欧美videosex性极品hd | 91免费看片| 中文在线a在线 | 日韩网站免费观看 | 国产一区 | 国产成人精品一区二区三区在线 | 色影视| av毛片| 免费h在线 | 亚洲第1页 | 久久香焦 | 秋霞电影一区二区三区 | 色在线免费| 一级视频在线免费观看 | 免费亚洲一区二区 | 91高清免费 |