手写Promise.all方法

379 阅读1分钟

    手写一个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)
})

image.png