您當前的位置:首頁 > 歷史

JS Tips #1:Promise.all 處理 Rejection 的技巧

作者:由 王仕軍 發表于 歷史時間:2017-05-18

翻譯自:Promise。all for Rejections and Resolves,E 文好的去看原文吧。

Promise 可以說是 JS 中非常重要的特性,它能幫我們解決回撥地獄的問題,即使是最新的 async/await 語法也常常結合 Promise 來使用。

Promise。all 這個 API 允許我們在多個操作完成之後繼續做某些事情,遺憾的是 Promise。all 只會在所有傳給他的 Promise 都 resolve 了之後才會 resolve,如果其中的一個 reject 了,那麼 Promise。all 後面的 then 就不會被執行,catch 會被執行,比如下面的例子:

Promise。all([

Promise。resolve(1),

Promise。reject(0)

])

。then(() => { console。log(‘resolved!’); })

。catch(() => { console。log(‘failed!’) });

// >> failed!

如果你需要在所有的 Promise 都結束之後執行某些操作,而不論他們是否成功,Promise。all 的這種機制就會成為一種限制,有個比較 trick 的辦法是給 then 和 catch 傳入相同的回撥,顯然,這會讓程式碼的可讀性大打折扣。

那麼,我們如何讓 Promise。all 坦然面對失敗呢?Jake Archibald 給出瞭解決方案:

Promise。all(promises。map(p => p。catch(() => undefined)));

如果 Promise 的 catch 回撥返回了 undefined,那麼 Promise 的失敗就會被當做成功來處理。下面是程式碼例項:

Promise。all([

// Resolves

Promise。resolve(1),

// Rejects after 2 seconds

new Promise((resolve, reject) => setTimeout(() => reject(1), 2000))

]。map(p => p。catch(() => undefined)))。then(() => console。log(‘done!’));

// >> done!

雖然這種方式也比較 trick,但能讓我們在不借助第三方庫的情況下不關心 Promise 是否成功而去執行後續操作。

既然很多人都有這種需求,那麼 JS 規範是不是該完善下了?沒錯,過些時日坑能你就可以用 Promise。prototype。finally 這種結構了,類似於 try catch finally 這種結構。

以上,本文完。

標簽: promise  catch  resolve  reject  console