成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

停止像這樣使用 "Async/Await",改用原版

開(kāi)發(fā) 前端
Async/await API的目的是允許開(kāi)發(fā)者像寫(xiě)同步代碼一樣寫(xiě)異步代碼。因此,可以使用try...catch來(lái)捕獲async/await錯(cuò)誤。

最近我看到一些開(kāi)發(fā)者使用這種方法來(lái)處理 async/await 錯(cuò)誤。

/**
* @param { Promise } promise
* @param { Object= } errorExt - Additional Information you can pass to the err object
* @return { Promise }
*/
function to(promise, errorExt) {
return promise
.then((data) => [null, data])
.catch((err) => {
if (errorExt) {
const parsedError = Object.assign({}, err, errorExt);
return [parsedError, undefined];
}
return [err, undefined];
});
}
async function doSomething() {
const [error1, result1] = await to(fetch(''));
if (error1) {
return;
}
const [error2, result2] = await to(fetch(result1));
if (error2) {
return;
}
// ...
}

正如你所看到的,他們把函數(shù)包起來(lái),把原來(lái)的Promise轉(zhuǎn)換成一個(gè)肯定會(huì)成功的 "Promise",并返回一個(gè)數(shù)組。

如果原始的Promise成功了,那么數(shù)組中的第一項(xiàng)是空的,表示沒(méi)有錯(cuò)誤,第二項(xiàng)是原始 Promise的結(jié)果。如果原來(lái)的Promise失敗了,那么數(shù)組的第一項(xiàng)是錯(cuò)誤,第二項(xiàng)是未定義。就是這樣了。

他們認(rèn)為這很優(yōu)雅,使代碼更易讀。但我不這么認(rèn)為,我也不建議這樣使用它

我認(rèn)為這樣的封裝有點(diǎn)過(guò)度,在大多數(shù)情況下,不需要這樣做。接下來(lái),我將從兩個(gè)角度說(shuō)明我的觀點(diǎn)。

1、從設(shè)計(jì)的角度來(lái)看

Async/await? API的目的是允許開(kāi)發(fā)者像寫(xiě)同步代碼一樣寫(xiě)異步代碼。因此,可以使用try...catch?來(lái)捕獲async/await錯(cuò)誤。

而這樣的函數(shù)似乎為我們考慮到了一切,但其他剛看到你的代碼的開(kāi)發(fā)者總會(huì)有這樣的疑問(wèn)。為什么to?函數(shù)返回的Promise所使用的await?沒(méi)有用try...catch來(lái)包裝?

圖片圖片

只有找到原始的to?函數(shù)定義,并理解其意圖,你才能知道 "啊,原來(lái)to函數(shù)返回的 Promise 永遠(yuǎn)不會(huì)被拒絕"。

所以它進(jìn)一步增加了其他開(kāi)發(fā)者的理解成本,使得熟悉的 async/await 變得不再 "熟悉"。

2、從實(shí)用性的角度來(lái)看

to?函數(shù)的主要使用情況是,在同一上下文中有多個(gè)await promises?,而它們相應(yīng)的錯(cuò)誤處理方式是不同的。那么就使用這個(gè)封裝函數(shù)對(duì)每個(gè)錯(cuò)誤進(jìn)行不同的處理,減少對(duì)try...catch的使用。

但在實(shí)際開(kāi)發(fā),在每個(gè)到函數(shù)之后,你需要使用if?語(yǔ)句來(lái)確定是否有錯(cuò)誤。這與使用try...catch的本意沒(méi)有什么不同,都是為了檢查錯(cuò)誤。

圖片

其次,在真實(shí)的生產(chǎn)環(huán)境中,下一個(gè)Promise依賴上一個(gè)Promise的情況并不少見(jiàn)。但重要的一點(diǎn)是,這兩個(gè)Promise通常是關(guān)聯(lián)函數(shù)。所以在外層使用try...catch來(lái)統(tǒng)一處理錯(cuò)誤是沒(méi)有問(wèn)題的。比如說(shuō):

圖片

最后,在JavaScript中,大多數(shù)Promise場(chǎng)景都是在 Input/output上,比如網(wǎng)絡(luò)IO和文件IO。這些IO場(chǎng)景可以將攔截器封裝在下層,并根據(jù)錯(cuò)誤代碼統(tǒng)一處理。例如,使用axios攔截器。

圖片

所以它可能并不像預(yù)期的那樣實(shí)用。也就是說(shuō),它可能只用于整個(gè)項(xiàng)目的一小部分,而且成本超過(guò)了收益。

這就是我所有的觀點(diǎn),你怎么看?你贊成這種做法嗎?

責(zé)任編輯:姜華 來(lái)源: 大遷世界
相關(guān)推薦

2024-12-30 08:22:35

2012-07-22 15:59:42

Silverlight

2025-05-08 01:33:00

Python字典if-else

2014-07-15 10:31:07

asyncawait

2016-11-22 11:08:34

asyncjavascript

2020-03-11 09:15:25

微信asyncawait

2023-10-08 10:21:11

JavaScriptAsync

2021-07-20 10:26:12

JavaScriptasyncawait

2022-08-27 13:49:36

ES7promiseresolve

2023-07-28 07:31:52

JavaScriptasyncawait

2021-06-28 07:27:43

AwaitAsync語(yǔ)法

2024-12-23 08:00:45

2021-06-15 05:36:45

Gulpawaitasync

2022-06-13 07:36:47

useEffectHooks

2023-04-14 08:10:59

asyncawait

2017-04-10 15:57:10

AsyncAwaitPromise

2022-11-21 09:01:00

Swift并發(fā)結(jié)構(gòu)

2014-07-15 10:08:42

異步編程In .NET

2017-08-02 14:17:08

前端asyncawait

2021-08-18 07:05:57

ES6Asyncawait
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 视频一区二区中文字幕 | 午夜视频一区二区 | 欧美中文在线 | 国产高清在线 | 99综合 | 四虎免费视频 | 欧美一区二区三区久久精品 | 黄色片在线网站 | 欧美综合久久 | 国产精品s色 | 91久久精品视频 | 国产精品日产欧美久久久久 | 日日草夜夜草 | 黄色片a级 | 日韩在线精品视频 | 在线播放亚洲 | 91免费观看| 亚洲激情一区二区三区 | 欧美久久一区二区三区 | 91在线视频播放 | 国产精品96久久久久久 | 一区二区精品 | 中文亚洲视频 | 免费观看一级黄色录像 | 亚洲风情在线观看 | 欧美精品二区 | 日本成人一区二区 | 成人在线 | 乱码av午夜噜噜噜噜动漫 | 色婷婷亚洲国产女人的天堂 | 欧美精品v| 91资源在线| 国产日韩欧美 | 成人一区二 | 亚洲一区二区三区在线播放 | 女人牲交视频一级毛片 | 久久久精品一区 | 国产成人精品在线 | 亚洲不卡在线视频 | av网站免费 | 91精品久久久久久久久 |