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

Posted mdge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了假设把官方的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)
                        })
                    }
                })
            }
        }
 
知道上面两个,我们就可以按顺序拿出我们想要的结果了

以上是关于假设把官方的promise.all去掉,实现自己的promise.all方法的主要内容,如果未能解决你的问题,请参考以下文章

Promise.all中对于reject的处理

手动实现Promise.all()

使用 Promise.all() 在 Promise 实现时执行操作

使用 Promise.all 避免唯一错误 E11000

JavaScript Promise.all - 如何检查解析状态?

ES6 Promise.all() 错误句柄 - 是不是需要 .settle()? [复制]