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)
                            })
                        }
                    })
                }
            }
     
    知道上面两个,我们就可以按顺序拿出我们想要的结果了
  • 相关阅读:
    flutter 计算时间日期 在当年的第几周
    Flutter Future 异步 FutureBuilder 获取数据后 加载Widget
    macOS server 中描述文件管理器开启提示“发生错误,代码为-1”
    VS Code 添加chrome调试及localhost 拒绝连接请求问题
    Finished with error: Error running pod install (Android Studio 运行flutter项目)
    flutter moudle 项目编译生成 .ios 和 .android 更改.xx项目代码不被覆盖 flutter make-host-app-editable
    flutter项目 通道Channel封装及使用案例
    react-native 调用 TouchableOpacity (触摸透明) 时报了一个警告
    webstorm2016.2 for mac 安装
    Computed read-only property vs function in Swift
  • 原文地址:https://www.cnblogs.com/MDGE/p/12458078.html
Copyright © 2011-2022 走看看