JS Tips #1:Promise.all 處理 Rejection 的技巧
翻譯自: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 這種結構。
以上,本文完。
上一篇:領導臨時通知開會要不要回去?
下一篇:關於幀同步的延遲?