最近在看promise.all的时候,整理了两种手动实现的写法,方便以后查阅,直接上代码吧
方法一
const promiseAll=(all)=>{
return new Promise((resolve,reject)=>{
var countNum=0;
var res=new Array(all.length);
for(var i=0;i<all.length;i++){
((i)=>{
Promise.resolve(all[i]).then((value)=>{
countNum++;
res[i]=value;
if(countNum===all.length){
return resolve(res)
}
},(reason)=>{
return reject(reason)
})
})(i)
}
})
}
let p1=Promise.resolve(1);
let p2=Promise.resolve('hello I am No2');
let p3=Promise.resolve(3);
promiseAll([p1,p2,p3]).then((value)=>{
console.log(value)
})// [1, "hello I am No2", 3]
方法二
const promiseAll=(arr)=>{
let returnRes=[];//用于存放每次执行后返回结果
return new Promise(function(resolve,reject){
let i=0;
next();
function next(){
arr[i].then(function(res){
returnRes.push(res);//存储每次得到的结果
i++;
if(i===arr.length){
resolve(returnRes);
}else{
next();
}
})
}
})
}
let p1=Promise.resolve(1);
let p2=Promise.resolve('hello I am No2');
let p3=Promise.resolve('hello I am No3');
promiseAll([p1,p2,p3]).then((value)=>{
console.log(value)
})// [1, "hello I am No2", "hello I am No3"]