欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS異步堆棧追蹤之為什么await勝過(guò)Promise

 更新時(shí)間:2021年04月28日 14:18:58   作者:淺笑·  
與直接使用Promise相比,使用async/await不僅可以使代碼更具可讀性,而且還可以在JavaScript引擎中實(shí)現(xiàn)一些有趣的優(yōu)化。這篇文章是關(guān)于一個(gè)這樣的優(yōu)化,涉及異步代碼的堆棧追蹤。

概述

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 時(shí),才恢復(fù) fn 的執(zhí)行
a() // "hello"

const promise = Promise.resolve()
// 將 fn 添加到回調(diào)鏈后,繼續(xù)執(zhí)行 fn
promise.then(fn) // "hello"

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

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

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

Promise

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

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

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

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

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

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

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

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

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

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

async/await

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

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

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

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

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

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

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

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

相關(guān)文章

  • js和css寫(xiě)一個(gè)可以自動(dòng)隱藏的懸浮框

    js和css寫(xiě)一個(gè)可以自動(dòng)隱藏的懸浮框

    用js和css寫(xiě)一個(gè)可以自動(dòng)隱藏的懸浮框。css肯定是用來(lái)控制樣式的,js用來(lái)控制器顯示與隱藏的,需要的朋友可以參考下
    2014-03-03
  • 記錄鼠標(biāo)的軌跡并回放的js代碼

    記錄鼠標(biāo)的軌跡并回放的js代碼

    用js實(shí)現(xiàn)的記錄鼠標(biāo)的軌跡并回放的效果,非常不錯(cuò)。
    2010-04-04
  • js常用DOM方法詳解

    js常用DOM方法詳解

    本文主要介紹了js常用的DOM方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • axios請(qǐng)求設(shè)置responseType為'blob'或'arraybuffer'下載時(shí)如何正確處理返回值

    axios請(qǐng)求設(shè)置responseType為'blob'或'arraybuffer&apo

    這篇文章主要給大家介紹了關(guān)于axios請(qǐng)求設(shè)置responseType為'blob'或'arraybuffer'下載時(shí)如何正確處理返回值的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • JavaScript實(shí)現(xiàn)星級(jí)評(píng)分

    JavaScript實(shí)現(xiàn)星級(jí)評(píng)分

    本文主要分享了JavaScript實(shí)現(xiàn)星級(jí)評(píng)分的實(shí)例代碼,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • js+Html實(shí)現(xiàn)表格可編輯操作

    js+Html實(shí)現(xiàn)表格可編輯操作

    這篇文章主要為大家詳細(xì)介紹了js+Html實(shí)現(xiàn)表格可編輯操作,能動(dòng)態(tài)添加刪除行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • JavaScript中實(shí)現(xiàn)Map的示例代碼

    JavaScript中實(shí)現(xiàn)Map的示例代碼

    本篇文章給大家介紹javascript中實(shí)現(xiàn)map的示例代碼,代碼寫(xiě)的簡(jiǎn)單易懂,可以獲取、刪除鍵值,剛興趣的朋友跟著腳本之家小編一起學(xué)習(xí)吧。
    2015-09-09
  • babel7按需加載polyfill示例詳解

    babel7按需加載polyfill示例詳解

    這篇文章主要為大家介紹了babel7按需加載polyfill示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • JavaScript實(shí)現(xiàn)多文件下載方法解析

    JavaScript實(shí)現(xiàn)多文件下載方法解析

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)多文件下載方法解析,文章通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Postman模擬發(fā)送帶token的請(qǐng)求方法

    Postman模擬發(fā)送帶token的請(qǐng)求方法

    下面小編就為大家分享一篇Postman模擬發(fā)送帶token的請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03

最新評(píng)論