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<args.length;i++){
let currentVal=args[i];
if(isPromise(currentVal)){
//调用then接受成功或失败结果
currentVal.then((data)=>{
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)
})
网友评论