Promise.all的性质快速复习:
接受一个promise数组
返回一个promise实例对象
promise数组中有一个reject时all函数立马返回结果为该reject内容的promise对象,即使其他都resolve或则有其他的reject。
promise数组无错误时,等待promise数组执行完毕才返回包含全部结果数组的promise对象。
实现PromiseAll函数
function promiseAll(promises){
return new Promise(function(resolve,reject){
if(!Array.isArray(promises)){
reject(new Error('no array'))
}
let result = [];
let count = 0;
let len = promises.length;
for(let i=0;i<len;i++){
promises[i].then(function(res){
result[i] = res
count++
if(count===len){
resolve(result)
}
},function(err){
reject(err)
})
}
});
}
注解说明
function promiseAll(promises){
return new Promise(function(resolve,reject){
// 避免非数组入参,可以增加promise对象类型进一步判断
if(!Array.isArray(promises)){
reject(new Error('no array'))
}
let result = [];
let count = 0;
let len = promises.length;
// 因为count在then内异步递增,所以count顺序无法控制,需要for循环产生一个序号
for(let i=0;i<len;i++){
// 依次编写每个promise的then回调
promises[i].then(function(res){
// 收集结果
result[i] = res
// count递增不随数组顺序依次完成
count++
// 当全部promise执行完成时count也就完成递增,可以判断是否可以resolve
if(count===len){
resolve(result)
}
},function(err){
// then第二个参数可以传入用于reject情况的回调函数
reject(err)
})
}
});
}
本文章仅供参考,欢迎纠错和建议。