Promise.all的实现

promise.all(iterable)方法返回一个Pormise实例,此实例在iterable参数内所有的promise都"完成(reslove)",或者参数中不含promise时回调完成(resolve);如果参数中promise有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个promise的结果。

//1.txt
测试1

//2.txt
测试2

//all.js
const fs=require('fs')

const utils=require('util')

let read=utils.promisify(fs.readFile); //转换为返回promise的函数

isPromise(val){
    if((val!==null&&typeof val==='object')|| typeof val==='function'){
            //then是否是函数
           if(typeof val.then==='function'){
                 return true
           }
           return false
    }
}

Promise.all=function(args){
     //首先promise.all返回的是一个Promise
     return new Promise((resolve,reject)=>{
         //设定数组存放结果
         let arr=[]
         let ind=0; //标识是否读取完毕
         let appendVal=(value,index)=>{
               arr[index]=value;
               if(++ind===args.length){
                  //标识符与数组长度一样证明加载完毕 把结果返回出去
                   resolve(arr)
              }
         }
         //循环数组每一项判断是否是promise
         for(let i=0;i{
                     appendVal(data,i)
                 },reject)
              }else{
                 //普通值直接添加
                 appendVal(currentVal,i)
              }
         }
     })
}

Promise.all([1,2,read('./1.txt','utf-8'),4,read('./2.txt','utf-8')]).then(res=>{
   console.log(res)  //结果:[1,2,'测试1',4,'测试2']
},err=>{
   console.log(err)
})

你可能感兴趣的:(Promise.all的实现)