promise.all()方法接收一个数组作为参数,当数组的所有promise都是resolve状态时,promise.all()才会成功。若有一个失败,他便被认为是失败的。
以下封装一个promise.all方法,解释都在注释里。
function isPromise(v){ //判断是不是个promise
if(typeof v === 'function' || (typeof v === 'undefined' && v != null)){
if(typeof v.then === 'function'){ //v.then是个函数,说明是个promise
return true
}
}
return false
}
Promise.all = function(values){ //传入一个数组
return new Promise((resolve,reject)=>{
let arr = []
let i = 0
let processData = function(key,value){ //key为all方法里传进来的数组得索引,value为对应resolve的值
arr[key] = value
if(++i === values.length){
resolve(arr) //得到数组结果
}
}
for(let i=0;i<values.length;i++){ //循环遍历一下传进来的这个数组
let current = values[i] //令current=传进来的数组的每一项
if(isPromise(current)){ //判断传进来的是promise还是普通数据
current.then(y=>{ //是promise,then得出他的结果,将索引和结果传递给processData方法
processData(i,y)
},reject)
}else{
processData(i,current) //不是promise,将索引和结果传递给processData方法
}
}
})
}
promise.all()可以将多个promise实例包装成一个新的promise实例。成功时,返回的是个结果数组,失败时,返回的是最先被reject的值。
它通常用于处理多个异步操作,比如,在请求多个数据时候,页面上要等这些数据都回来时才能正常显示,数据没回来之前显示加载中。