摘要:由于我們沒有,或者的結(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ò)誤的。
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ì)它的返回值做任何事情。
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í)行。
如果你想在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
摘要:異步流程管理說(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天生為異步而生, 正如布道...
摘要:本文討論地址閱讀時(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)快速了解文章里...
摘要:對(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ù)組或者...
摘要:的科學(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 我...
摘要:如果是你是高級(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...
閱讀 2843·2021-09-10 10:50
閱讀 2198·2019-08-29 16:06
閱讀 3204·2019-08-29 11:02
閱讀 1104·2019-08-26 14:04
閱讀 2815·2019-08-26 13:24
閱讀 2310·2019-08-26 12:16
閱讀 556·2019-08-26 10:29
閱讀 3104·2019-08-23 18:33