Promise.all如何不抛出异常等到所有的成员执行完成
Promise.all的基本用法
Promise.all([promise1, promise2, promise3, ...])
.then(res => {console.log(`res=${res}`)})
.catch(err => {console.log(`err=${err}`)});
promise会等待所有的成员[promise1, promise2, promise3, ...]的结果:
- 如果所有成员都执行完成resolved,那么执行then分支
- 如果其中有任何一个成员失败reject,那么执行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
因为promise b返回了reject,那么Promise.all就执行catch分支。
但是有些时候,我们希望能让所有的promise都执行完成,不管成功还是失败,然后才继续后面的操作。
解决办法:
Promise.all([a,b,c].map(p => p.catch(e => {...})))
.then(res => {...})
.catch(err => {...});
其含义是说,如果任何promise遭遇reject,截获这个异常,然后就可以不抛出异常了,此时可以把异常转换为普通的输出,然后在Promise.all().then(...)里面分析所有的输出,从而再决定哪些是异常输出,哪些是正常输出。
例如:
$ 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之后,这个exception被截获了,并且把异常的内容2改写成100,然后在Promise.all().then(...)里面能够读取到这个100的值。此时then的逻辑就可以区分是否有异常产生了,即如果res的值大于100,就说明是个异常输出,否则就是正常输出。