Promise.all()

266 阅读1分钟

每天做个总结吧,坚持就是胜利!

    /**
        @date 2021-06-15
        @description Promise.all()
    */

壹(序)

Promise.all方法是Promise内置的方法之一,接受一个带有iterator接口的数据结构如ArraySet等,每个值应该是Promise实例,如果不是的话,则调用Promise.resolve()方法将其转换为Promise实例;返回一个Promise,如果每个Promise实例都是fulfilled状态,则返回一个由各个Promise实例的返回值组成的数组,如果其中一个Promise实例rejected状态,则返回这个rejectedPromise实例的返回值。

贰(代码实现)

Promise.all = function (promises) {
  let res = [],
    counter = 0;

  return new Promise((resolve, reject) => {
    for (let i = 0; i < promises.length; i++) {
      const promise = promises[i];

      Promise.resolve(promise)
        .then((resp) => {
          counter++;
          res.push(resp);
          if (counter === promises.length) {
            return resolve(res);
          }
        })
        .catch((reason) => {
          reject(reason);
        });
    }
  });
};
 
 // 测试
const p1 = Promise.resolve(2);
const p2 = Promise.resolve(3);

let promises = [1, p1, p2];

Promise.all(promises)
  .then((resp) => {
    console.log(resp); // [1, 2, 3]
  })
  .catch((reason) => {
    console.log(reason);
  });
  
const p3 = Promise.resolve(3);
const p4 = Promise.reject(4);

promises = [p3, p4, 5];

Promise.all(promises)
  .then((resp) => {
    console.log(resp);
  })
  .catch((reason) => {
    console.log(reason); // 4
  });