Promise.all如何不拋出異常等到所有的成員執(zhí)行完成
Promise.all的基本用法
Promise.all([promise1, promise2, promise3, ...])
.then(res => {console.log(`res=${res}`)})
.catch(err => {console.log(`err=${err}`)});
promise會(huì)等待所有的成員[promise1, promise2, promise3, ...]的結(jié)果:
- 如果所有成員都執(zhí)行完成resolved,那么執(zhí)行then分支
- 如果其中有任何一個(gè)成員失敗reject,那么執(zhí)行catch分支。
例如:
$ cat test.js
'use strict';
const a = Promise.resolve(1);
const b = Promise.reject(2);
const c = Promise.resolve(3);
Promise.all([a,b,c])
.then(res => {console.log(`res=${res}`)})
.catch(err => {console.log(`err=${err}`)});
$ node test.js
err=2
因?yàn)閜romise b返回了reject,那么Promise.all就執(zhí)行catch分支。
但是有些時(shí)候,我們希望能讓所有的promise都執(zhí)行完成,不管成功還是失敗,然后才繼續(xù)后面的操作。
解決辦法:
Promise.all([a,b,c].map(p => p.catch(e => {...})))
.then(res => {...})
.catch(err => {...});
其含義是說,如果任何promise遭遇reject,截獲這個(gè)異常,然后就可以不拋出異常了,此時(shí)可以把異常轉(zhuǎn)換為普通的輸出,然后在Promise.all().then(...)里面分析所有的輸出,從而再?zèng)Q定哪些是異常輸出,哪些是正常輸出。
例如:
$ cat test.js
'use strict';
const a = Promise.resolve(1);
const b = Promise.reject(2);
const c = Promise.resolve(3);
Promise.all([a,b,c].map(p => p.catch(e => {console.log(`pe=${e}`); return 100})))
.then(res => {
console.log(`map res=${res}`);
for (let i=0; i<res.length; ++i) {
if (res[i]) {
console.log(`map res[${i}]=${res[i]}`);
}
}
})
.catch(err => {console.log(`map err=${err}`)});
$ node test.js
pe=2
map res=1,100,3
map res[0]=1
map res[1]=100
map res[2]=3
我們看到promise b拋出reject之后,這個(gè)exception被截獲了,并且把異常的內(nèi)容2改寫成100,然后在Promise.all().then(...)里面能夠讀取到這個(gè)100的值。此時(shí)then的邏輯就可以區(qū)分是否有異常產(chǎn)生了,即如果res的值大于100,就說明是個(gè)異常輸出,否則就是正常輸出。