手动实现Promise.all

37 阅读1分钟

先来看MDN官网对promise.all方法的介绍:

简单理解,当参数中的promise有一个失败了就直接返回失败的结果,返回第一个失败的结果,都成功返回所有的参数结果;


function PromisAll(promises){
    // 返回一个promise实例
    return new Promise((resolve,reject)=>{
    // 做一个判断参数是否是数组
         if(!Array.isArray(promises)){
                 return reject(new TypeError("arguments is not array"))
         }
         let count=0,result=new Array(promises.length);
         //接收新的结果参数 建立一个伪数组
         for(let i=0;i<promises.length;i++){
                //运用promise特性 只会有一个状态
                 Promise.resolve(promises[i]).then((res)=>{
                         count++;
                         // 把每次返回成功的数据添加到数组中
                         result[i]=res;
                         if(count===promises.length){
                              // 数据接收完成
                              return resolve(result)
                         }
                 },rej =>reject(rej))
         
         }
    })
}
let prm1=new Promise((resolve,reject)=>{
	resolve("1")
})
let prm2=new Promise((resolve,reject)=>{
	reject("2")
})
let prm3=new Promise((resolve,reject)=>{
	resolve("3")
})
let prm4=new Promise((resolve,reject)=>{
	resolve("4")
})
PromisAll([prm1,prm2,prm3,prm4]).then(
       (res)=>console.log("resdss",res),
       (res)=>console.log("reeoe",res)
       )