zoukankan      html  css  js  c++  java
  • 假设把官方的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)
                            })
                        }
                    })
                }
            }
     
    知道上面两个,我们就可以按顺序拿出我们想要的结果了
  • 相关阅读:
    612.1.004 ALGS4 | Elementary Sorts
    612.1.003 ALGS4 | Stacks and Queues
    612.1.002 ALGS4 | Analysis of Algorithms
    132.1.001 Union-Find | 并查集
    如何优雅使用Coursera ? —— Coursera 视频缓冲 & 字幕遮挡
    Jupyter notebook 使用多个Conda 环境
    如何从 GitHub 上下载单个文件夹
    在jupyter notebook中同时安装python2和python3
    修改ps工具栏字体大小
    python之集合
  • 原文地址:https://www.cnblogs.com/MDGE/p/12458078.html
Copyright © 2011-2022 走看看