手写Promise.all

1.原生promise.all运行机制

  • 输入为Iterator类型的参数,可以是Array,Map, Set,String ,可能也得包括魔改的Iterator(Symbol.iterator)之类
  • 若输入的可迭代数据里不是Promise,则也需要原样输出
  • 返回一个Promise实例,可以调用then和catch方法
  • 输出在then里体现为保持原顺序的数组
  • 输出在catch体现为最早的reject返回值
  • 空 Iterator, resolve返回空数组
                // 实现promise.all
                // all方法接受一个可迭代的对象promises,可以是数组...之类的,数组的元素可能是promise也可能不只是
                // 如果是promise数组,那么每个promise的执行结果就作为结果数组返回
                // 如果不是promise数组,那么原数组作为结果返回
                all(promises) {
                    // 首先all方法返回的是一个promise实例对象
                    // all方法是当promises中的所有promise的状态均为fullfill时返回的这个promise的状态才会是fullfilled
                    // 同时all方法执行的结果,也就是5个promise结果的集合会作为执行结果
                    return new Promise((resolve, reject) => {
                        // 记录一下promises的长度,看看一共多少个promise
                        let length = promises.length;
                        // 结果的集合
                        let result = [];
                        // 记录执行成功的promise的个数
                        let count = 0;
                        // 遍历
                        for (let index = 0; index < length; index++) {
                            //首先把promises中所有的元素进行一下包装
                            Promise.resolve(promises[index]).then((res) => {
                                // 走到这里说明这个promise执行完成了
                                // 并且res是这个promise执行完成的结果
                                result.push(res);
                                count++;
                                // 如果全部执行成功了就返回
                                if (count === length) {
                                    resolve(result)
                                }
                            },(reason)=>{
                                // 如果有一个执行失败了,那么就宣告这个promise失败
                                reject(reason)
                            })
    
                        }
    
                    })
                }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值