成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯]await VS return VS return await

Gemini / 1799人閱讀

摘要:由于我們沒有,或者的結(jié)果,所以我們無(wú)法對(duì)它做出任何反應(yīng)。因?yàn)槲覀兊却说姆祷刂?,所以它的?huì)被返回并且被拋出,的代碼塊就會(huì)執(zhí)行。但無(wú)論如何,如果沒有報(bào)錯(cuò)而是順利執(zhí)行,我們依舊無(wú)法對(duì)它的返回值做任何事情。

原文地址:await vs return vs return await
作者:Jake Archibald

當(dāng)編寫異步函數(shù)的時(shí)候,await,return,return await三者之間有一些區(qū)別,從中選取正確的方式是很重要的。
我們從下面這個(gè)異步函數(shù)開始:

async function waitAndMaybeReject(){
    // 等待1秒鐘
    await new Promise(resolve => setTimeout(resolve, 1000));
    // 拋一枚硬幣
    const isHeads = Boolean(Math.round(Math.random()));
    if(isHeads) return "yay";
    throw Error("Boo!");
}

上面的函數(shù)會(huì)等待1秒鐘后返回一個(gè)promise,然后有50%的機(jī)會(huì)成功返回yay或者拋出一個(gè)error。讓我們用幾種稍微不同的方式使用它。

直接調(diào)用
async function foo() {
    try{
        waitAndMaybeReject();
    }catch(e){
        return "caught";
    }
}

在此處,如果調(diào)用了foo,返回的promise的狀態(tài)始終都是resolved,值也永遠(yuǎn)是undefined,而且沒有等待。
由于我們沒有await,或者return waitAndMaybeReject()的結(jié)果,所以我們無(wú)法對(duì)它做出任何反應(yīng)。像這樣的代碼通常是錯(cuò)誤的。

Awaiting
async function foo(){
    try{
        await waitAndMaybeReject();
    }catch(e){
        return "caught";
    }
}

在此處,如果調(diào)用了foo,返回的promise將始終等待1秒鐘,然后結(jié)果要么狀態(tài)為resolved,值為undefined,要么狀態(tài)為resolved,值為"caught"
因?yàn)槲覀兊却?b>waitAndMaybeReject()的返回值,所以它的rejection會(huì)被返回并且被拋出(throw),catch的代碼塊就會(huì)執(zhí)行。但無(wú)論如何,如果waitAndMaybeReject()沒有報(bào)錯(cuò)而是順利執(zhí)行,我們依舊無(wú)法對(duì)它的返回值做任何事情。

Returning
async function foo() {
    try {
        return waitAndMaybeReject();
    }
    catch (e) {
        return "caught";
    }
}

在此處,如果調(diào)用了foo,返回的promise將始終等待1秒鐘,然后結(jié)果要么是狀態(tài)為resolved,值為"yaa",要么是狀態(tài)是reject,拋出錯(cuò)誤Error("Boo!")。
通過(guò)return waitAndMaybeReject()這行代碼,我們直接傳遞了它的返回結(jié)果,所以我們的catch代碼塊永遠(yuǎn)不會(huì)執(zhí)行。

Return-awaiting

如果你想在try代碼塊中得到帶有正確返回值的resolved狀態(tài),在catch中捕獲異常,那么正確的選擇就是return await。

async function foo() {
    try {
        return await waitAndMaybeReject();
    }
    catch (e) {
        return "caught";
    }
}

在此處,如果調(diào)用foo,返回的promise將始終等待1秒鐘,然后結(jié)果要么是狀態(tài)為resolved,值為"yay",要么是狀態(tài)為resolved,值為"caught"
因?yàn)槲覀兊却?b>waitAndMaybeReject()的結(jié)果,所以它的異常rejecttion會(huì)被返回并且被拋出(throw),catch的代碼塊就會(huì)執(zhí)行。如果waitAndMaybeReject()順利執(zhí)行沒有報(bào)錯(cuò),就返它的結(jié)果。

如果對(duì)上面的內(nèi)容還是覺著困惑,那么將代碼拆分成兩個(gè)步驟來(lái)看可能會(huì)比較好理解:

async function foo() {
  try {
    // 等待 waitAndMaybeReject() 的結(jié)果來(lái)解決,
    // 并且將 fullfill 的值賦給 fullfilledValue:
    const fulfilledValue = await waitAndMaybeReject();
    // 如果 waitAndMaybeReject() reject了,
    // 我們的代碼就會(huì)拋出異常,并且進(jìn)入 catch 代碼塊的邏輯。
    // 否則,這里的代碼就會(huì)繼續(xù)運(yùn)行下面的語(yǔ)句:
    return fulfilledValue;
  }
  catch (e) {
    return "caught";
  }
}
Note: 在try/catch之外的代碼塊中執(zhí)行return await是多余的(如前所述,直接return即可),甚至Eslint還專門有規(guī)則來(lái)檢測(cè)這種場(chǎng)景,但是在try/catch代碼塊之內(nèi),Eslint就允許這種操作。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99336.html

相關(guān)文章

  • js異步解決方案 --- 回調(diào)函數(shù) vs promise vs generater/yield vs

    摘要:異步流程管理說(shuō)白了就是為了解決回調(diào)地獄的問(wèn)題。對(duì)象代表一個(gè)異步操作,有三種狀態(tài)進(jìn)行中已成功和已失敗。如果改變已經(jīng)發(fā)生了,你再對(duì)對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。執(zhí)行函數(shù)后返回的是一個(gè)遍歷器對(duì)象,可以依次遍歷函數(shù)內(nèi)部的每一個(gè)狀態(tài)。 javascript -- 深度解析異步解決方案 高級(jí)語(yǔ)言層出不窮, 然而唯 js 鶴立雞群, 這要說(shuō)道js的設(shè)計(jì)理念, js天生為異步而生, 正如布道...

    0xE7A38A 評(píng)論0 收藏0
  • await、returnreturn await 的陷阱

    摘要:本文討論地址閱讀時(shí)間大概分鐘和有很多容易被忽視的不同之處。首先定義一個(gè)異步函數(shù)等待秒函數(shù)等待秒鐘,然后有一半的概率返回,一半的概率拋出異常。這個(gè)是最符合我們預(yù)期的寫法。 dev-reading/fe 是一個(gè)閱讀、導(dǎo)讀、速讀的 repo,不要依賴于 dev-reading/fe 學(xué)習(xí)知識(shí)。本 repo 只是一個(gè)快速了解文章內(nèi)容的工具,并不提供全文解讀和翻譯。你可以通過(guò)本平臺(tái)快速了解文章里...

    qujian 評(píng)論0 收藏0
  • JavaScript 的 4 種數(shù)組遍歷方法: for VS forEach() VS for/in

    摘要:對(duì)于,除非使用箭頭函數(shù),它的回調(diào)函數(shù)的將會(huì)變化。使用測(cè)試下面的代碼,結(jié)果如下打印打印要點(diǎn)使用的規(guī)則要求所有回調(diào)函數(shù)必須使用箭頭函數(shù)。 譯者按: JS 騷操作。 原文:For vs forEach() vs for/in vs for/of in JavaScript 譯者: Fundebug 本文采用意譯,版權(quán)歸原作者所有 我們有多種方法來(lái)遍歷 JavaScript 的數(shù)組或者...

    joyqi 評(píng)論0 收藏0
  • 和少婦白潔一起學(xué)JavaScript之Async/Await II

    摘要:的科學(xué)定義是或者,它的標(biāo)志性原語(yǔ)是。能解決一類對(duì)語(yǔ)言的實(shí)現(xiàn)來(lái)說(shuō)特別無(wú)力的狀態(tài)機(jī)模型流程即狀態(tài)。容易實(shí)現(xiàn)是需要和的一個(gè)重要原因。 前面寫了一篇,寫的很粗,這篇講講一些細(xì)節(jié)。實(shí)際上Fiber/Coroutine vs Async/Await之爭(zhēng)不是一個(gè)簡(jiǎn)單的continuation如何實(shí)現(xiàn)的問(wèn)題,而是兩個(gè)完全不同的problem和solution domain。 Event Model 我...

    番茄西紅柿 評(píng)論0 收藏0
  • 】12個(gè)提高 JavaScript 技能的概念!

    摘要:如果是你是高級(jí)或者初級(jí)開發(fā)人員,了解它的基本概念非常重要。由于是基本類型,因此的值等于的值,并且可以認(rèn)為此時(shí)與完全不同。展開運(yùn)算符可用于提取數(shù)組的各個(gè)元素。函數(shù)本身返回從數(shù)組中刪除的項(xiàng)。如果未指定結(jié)束位置,則返回?cái)?shù)組的其余部分。 譯者:前端小智 原文:hackernoon.com/12-javascri… JavaScript 是一種復(fù)雜的語(yǔ)言。如果是你是高級(jí)或者初級(jí) JavaScript...

    Eidesen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<