手写一个Promise.all。简单讲解一下大致思路:
- 这个方法返回的是一个promise,所以就直接return一个promise,然后在里面定义一个空数组。
- 去循环传进来的数组 去判断他是不是一个promise,如果不是就直接把结果给空数组赋值,这里要考虑结果顺序的问题。
- 如果是promise就去调用他的then和catch方法,利用promise的特性,我们在catch中掉用reject方法,因为有一个报错就结束。在then中给空数组赋值。
- 最后还要考虑什么时候resolve的问题.ok多的不说上代码:
Promise.myAll = function(arr){
let resArr = new Array(arr.length).fill(null)
return new Promise((resolve,reject)=>{
let count = 0
arr.forEach((pm,index) => {
if(pm instanceof Promise){
pm.then(res=>{
resArr[index] = res
++count
if(count == arr.length)
resolve(resArr)
}).catch(err=>{
reject(err)
})
}else{
resArr[index] = res
++count
if(count == arr.length)
resolve(resArr)
}
});
})
}
let p = new Promise((resolve,reject)=>{
setTimeout(function(){
resolve(111)
},1000)
})
let p1 = new Promise((resolve,reject)=>{
setTimeout(function(){
resolve(222)
},2000)
})
let p2= new Promise((resolve,reject)=>{
setTimeout(function(){
reject(222)
},2000)
})
Promise.myAll([p,p1]).then(res=>{
console.log("成功了",res)
})
Promise.myAll([p,p2]).then(res=>{
console.log(res)
}).catch(err=>{
console.log("失败了",err)
})