实现Promise.all方法

实现Promise.all方法

功能:Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

	function test(i) {
            return new Promise((resolve, reject) => {
                if (Math.random() < 0.9) {
                    resolve(i)
                } else {
                    reject(i)
                }
            })
        }
        //存储Promise的数组
        const arr = [];

        for (let i = 0; i < 10; i++) {
            //向数组内添加多个Promise对象
            arr.push(test(i))
        }

        const p = Promise.all(arr)

        p.then(result => {
            //如果全部为resolved状态则为一个成功的数组
            //例如:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
            console.log(result)
        }, err => {
            //如果其中有个的状态为rejected状态则直接推出失败的状态的结果
            //例如:第一个失败了则输出2
            console.log(err)
        })

按照其实现的功能,模拟代码如下

	function PromiseAll(pros) {
            //返回一个新的Promise对象
            return new Promise((resolve, reject) => {
                //判断传入的是否是一个可迭代对象
                if (!pros[Symbol.iterator]) {
                    throw TypeError(typeof pros +' is not iterable (cannot read property Symbol(Symbol.iterator))')
                }
                //声明一个数组存放所有成功的结果
                const arr = []
                //判断传入的数据是否为一个字符串,如果是则用''分割成数组
                pros = typeof pros == 'string' ? pros.split('') : pros
                //遍历数组中的每一项
                pros.forEach((pro, index) => {

                    Promise.resolve(pro).then(data => {
                        //当状态为成功时结果添加进成功数组中
                        arr.push(data)
                        //当成功数组的长度与Promise对象数组的长度一致时,表示前面的Promise结果也为成功,
                        //则推出成功状态,与成功结果的数组
                        if (arr.length == pros.length) {
                            resolve(arr)
                        }
                    }, err => {
                        //如果有一个失败的直接推出失败状态与失败的状态的结果
                        reject(err)
                    })
                });
            })
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值