接收一个Promise数组,并返回一个新的Promise,当所有Promise都成功时,将其结果以数组形式进行返回;如果有任何一个Promise失败,则立即返回失败的原因。
关键点:返回一个Promise,for循环执行每个Promise,计数和catch判断成功还是失败。
function promiseAll(promises) {
return new Promise((resolve, reject) => {
const results = [];
let completedCount = 0;
// 没有任务
if(!promises.length) {
return resolve(results)
}
promises.forEach((promise, i) => {
Promise.resolve(promise)
.then(result => {
completedCount ++;
results[i] = result;
if(completedCount === promises.length) {
resolve(results);
}
})
.catch(error => {
reject(error)
})
});
});
}
使用
let p1 = Promise.resolve(1);
let p2 = 2;
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 3);
});
let p4 = Promise.reject('出错啦')
promiseAll([ p1, p2, p3 ]).then((res) => {
console.log(res, 'res---1')
}).catch((err) => {
console.log('err', err)
})