發(fā)布于:2021-02-18 00:00:34
0
221
0
Promise已經成為JavaScript的不可思議的補充。它們?yōu)槲覀児?jié)省了回調的麻煩,使異步編碼更易于維護,并允許我們一次跟蹤多個異步進程。 Promise.all 浮現(xiàn)在腦海中,讓我們在多個諾言得到解決時做出反應。不幸的是,Promise.all 只有在所有的Promise都得到解決時才解決,因此,如果任何一個Promise都失敗了,catch則調用而不是then:
Promise.all([
Promise.resolve(1),
Promise.reject(0)
])
.then(() => { console.log('resolved!'); })
.catch(() => { console.log('failed!') });
// >> failed!
如果您希望執(zhí)行相同的功能而不管陣列中的任何Promise是否被拒絕,這都是一個問題。您可以提供與相同的功能then ,catch 但是這可能導致維護問題,并偶爾出現(xiàn)“ WTF就是這個!”。其他工程師的評論。
那么,Promise.all 無論有何拒絕,我們都想觸發(fā)功能時該怎么辦? 杰克·阿奇博爾德有答案:
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!
盡管第二個Promise被拒絕,但Promise.all then 仍被稱為!將來,我們將能夠Promise.prototype.finally用來更輕松地處理成功和失敗。
作者介紹