手写promise.all方法

promise.all接收一个promise对象的数组作为参数,只有数组里的所有promise状态为rosolve时,才会去调用 .then 方法,它们是并发执行的。

      var p1 = Promise.resolve(1),
        p2 = Promise.resolve(2),
        p3 = Promise.resolve(3);
      Promise.all([p1, p2, p3]).then((e) => {
        console.log(e);//[1, 2, 3]
      });

一旦接收的数组中出现一个promise的reject状态,都不会执行then里的方法,直接执行catch里的方法。
如果元素不是 Promise 对象,则使用Promise.resolve 转成 Promise 对象。

      Promise.all([1, 2, 3]).then((e) => {
        console.log(e);//[1,2,3]
      });

在这里插入图片描述
需要明确第一步是判断传参是否为数组,不是则抛出错误;
接下来对每个参数使用Promise.resolve()方法,将现有对象转换为Promise对象,从而控制异步流程,一旦错误,catch到失败;

function promiseAll(promises) {
        return new Promise(function (resolve, reject) {
          //promises必须是一个数组
          if (!(promises instanceof Array)) {
            throw new TypeError("promises must be an Array");
          }
          var len = promises.length,
            resolvedCount = 0,
            resolvedArray = new Array(len);
          for (var i = 0; i < len; i++) {
            (function (i) {
              Promise.resolve(promises[i])
                .then(
                  (value) => {
                    resolvedCount++;
                    resolvedArray[i] = value;
                    if (resolvedCount == len) {
                      return resolve(resolvedArray);
                    }
                  },
                  (re) => {
                    return reject(re);
                  }
                )
                .catch((re) => {
                  console.log(re);
                });
            })(i);
          }
        });
      }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值