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