新聞中心
最近我看到一些開發(fā)者使用這種方法來處理 async/await 錯(cuò)誤。

創(chuàng)新互聯(lián)建站致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷,提供網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷、小程序設(shè)計(jì)、公眾號(hào)商城、等建站開發(fā),創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。
/**
* @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ù)包起來,把原來的Promise轉(zhuǎn)換成一個(gè)肯定會(huì)成功的 "Promise",并返回一個(gè)數(shù)組。
如果原始的Promise成功了,那么數(shù)組中的第一項(xiàng)是空的,表示沒有錯(cuò)誤,第二項(xiàng)是原始 Promise的結(jié)果。如果原來的Promise失敗了,那么數(shù)組的第一項(xiàng)是錯(cuò)誤,第二項(xiàng)是未定義。就是這樣了。
他們認(rèn)為這很優(yōu)雅,使代碼更易讀。但我不這么認(rèn)為,我也不建議這樣使用它
我認(rèn)為這樣的封裝有點(diǎn)過度,在大多數(shù)情況下,不需要這樣做。接下來,我將從兩個(gè)角度說明我的觀點(diǎn)。
1、從設(shè)計(jì)的角度來看
Async/await? API的目的是允許開發(fā)者像寫同步代碼一樣寫異步代碼。因此,可以使用try...catch?來捕獲async/await錯(cuò)誤。
而這樣的函數(shù)似乎為我們考慮到了一切,但其他剛看到你的代碼的開發(fā)者總會(huì)有這樣的疑問。為什么to?函數(shù)返回的Promise所使用的await?沒有用try...catch來包裝?
只有找到原始的to?函數(shù)定義,并理解其意圖,你才能知道 "啊,原來to函數(shù)返回的 Promise 永遠(yuǎn)不會(huì)被拒絕"。
所以它進(jìn)一步增加了其他開發(fā)者的理解成本,使得熟悉的 async/await 變得不再 "熟悉"。
2、從實(shí)用性的角度來看
to?函數(shù)的主要使用情況是,在同一上下文中有多個(gè)await promises?,而它們相應(yīng)的錯(cuò)誤處理方式是不同的。那么就使用這個(gè)封裝函數(shù)對(duì)每個(gè)錯(cuò)誤進(jìn)行不同的處理,減少對(duì)try...catch的使用。
但在實(shí)際開發(fā),在每個(gè)到函數(shù)之后,你需要使用if?語句來確定是否有錯(cuò)誤。這與使用try...catch的本意沒有什么不同,都是為了檢查錯(cuò)誤。
其次,在真實(shí)的生產(chǎn)環(huán)境中,下一個(gè)Promise依賴上一個(gè)Promise的情況并不少見。但重要的一點(diǎn)是,這兩個(gè)Promise通常是關(guān)聯(lián)函數(shù)。所以在外層使用try...catch來統(tǒng)一處理錯(cuò)誤是沒有問題的。比如說:
最后,在JavaScript中,大多數(shù)Promise場(chǎng)景都是在 Input/output上,比如網(wǎng)絡(luò)IO和文件IO。這些IO場(chǎng)景可以將攔截器封裝在下層,并根據(jù)錯(cuò)誤代碼統(tǒng)一處理。例如,使用axios攔截器。
所以它可能并不像預(yù)期的那樣實(shí)用。也就是說,它可能只用于整個(gè)項(xiàng)目的一小部分,而且成本超過了收益。
這就是我所有的觀點(diǎn),你怎么看?你贊成這種做法嗎?
網(wǎng)頁名稱:停止像這樣使用"Async/Await",改用原版
文章起源:http://m.5511xx.com/article/ccehsgi.html


咨詢
建站咨詢
