Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
实战:
Promise.all([
this.getSites(),
this.getAreas()
]).then(([sites, allSiteAreaNodes])=>{
let allNodes = [];
let allAreaNodesGroups = _.groupBy(allSiteAreaNodes, 'SiteID');
}
对Promise.all进行讲解:
const p = Promise.all([p1, p2, p3]);
上面代码中,Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。
1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数resolve。
2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数reject。
Promise.all的不足之处:
Promise.all的特性 是会执行里面的所有异步操作,遇到抛错就取消执行,并不会继续往下执行了。
有时我们 需要能继续执行下去。这样也是有方法能实现的…
// 代码 解决:在catch里面resolve就行了
// 测试了下 解决方式还能实现
var p1 = new Promise(resolve => {
let p1Data = b;
resolve(p1Data)
}).catch(err => {
return Promise.resolve("P1 无数据")
})
var p2 = new Promise(resolve => {
let p2Data = 'p2的有数据';
resolve(p2Data)
}).catch(err => {
return Promise.resolve("P2 无数据")
})
Promise.all([p1, p2]).then(res => {
console.log(res);
}).catch(err => {
throw new Error("Promise 执行错误", err)
})
// ["P1 无数据","P2 无数据"]