假设把官方的promise.all去掉,实现自己的promise.all方法

搞清题意了没?

我们要搞清楚两个问题,

1.

let arr = []

arr[3] = 'str'

arr的长度是几,答案是3,

2.

  function test(){
            return new Promise((resolve)=>{
                setTimeout(()=>{
                    resolve(123)
                },3000)
            })
        }
        Promise.resolve( 
            test()
        ).then((res)=>{
            console.log(res)
        })
这个我们会等resolve结束再执行console.log(res)

Promise本身有个all方法,首先我们把Promise.all = null 

然后我们把

Promise.all = promiseAll
        function promiseAll(param){
            if(!Array.isArray(param)){
                throw new Error('param is not Array')  //首先判断下参数是不是数组
            }else{
                return new Promise((resolve)=>{   //return Promise,因为我们知道Promise.all是返回的Promise
                    let _arr_ = []
                    let index = 0
                    if(param.length == 0){
                        resolve(_arr_)
                    }
                    function processPromise(i,data){
                        _arr_[i] = data
                        if(++index == param.length){ 
        //为什么我要重新定一个变量呢,如果换成_arr_.length会有什么问题呢
          //因为当在3秒的那个执行完,他会将数组的第三项赋值,会造成第二项为空值
          //输出结果很奇怪
                            resolve(_arr_)
                        }

                        
                    }
                    for(let i=0;i<param.length;i++){
                        Promise.resolve(param[i]).then((data)=>{
                            console.log(111)
                            processPromise(i,data)
                        }).catch((err)=>{
                            console.log(err)
                        })
                    }
                })
            }
        }
 
知道上面两个,我们就可以按顺序拿出我们想要的结果了
原文地址:https://www.cnblogs.com/MDGE/p/12458078.html