首先看Promise.all的定义
Promise.all(iterable)方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。
function all(promiseArr){
let index = 0;//记录promise完成数
let result = [];//记录promise结果
//all方法返回的是一个promise
return new Promise((resolve,reject)=>{
promiseArr.forEach((p,i)=>{
//让非promise也能返回
Promise.resolve(p)
.then((res)=>{
//保存每项结果到每项
result[i]=res;
//全部完成返回结果
if(++index === promiseArr.length){
resolve(result)
}
})
.catch((e)=>{
//有一个promise发生错误立即返回
reject(e);
})
})
})
}
//测试
let arr = [Promise.resolve("successA"),Promise.resolve("successB"),Promise.resolve("successC")]
all(arr).then((res)=>{console.log("全部成功",res)}).catch((err)=>{console.log("有个失败了",err)})