likes
comments
collection
share

Promise已婚,Promise.all该怎么办?手动撮合!

作者站长头像
站长
· 阅读数 37

JS手动实现Promise.all

JavaScript中的Promise.all方法可以接收一个promise数组作为参数,返回一个新的promise对象,该对象在数组中所有promise都成功时才会被resolve。如果其中有一个promise失败,则Promise.all会立即将其reject,并且不再等待其他promise的执行结果。本文将介绍如何手动实现这个方法。

实现步骤

我们来看一下实现Promise.all的思路。首先,我们需要创建一个新的Promise对象,然后遍历传入的promise数组,当所有promise都成功时,我们将返回一个包含所有promise结果的数组,否则我们将直接reject这个新的Promise对象。

下面是具体的实现步骤:

  1. 创建一个新的Promise对象。
javascriptCopy Code
function myPromiseAll(promises) {
  return new Promise((resolve, reject) => {
    // ...
  });
}
  1. 创建一个空数组来存储每个promise的结果。
javascriptCopy Code
function myPromiseAll(promises) {
  let results = [];
  return new Promise((resolve, reject) => {
    // ...
  });
}
  1. 遍历传入的promise数组,对每个promise调用then方法,将结果存入results数组。
javascriptCopy Code
function myPromiseAll(promises) {
  let results = [];
  return new Promise((resolve, reject) => {
    promises.forEach((promise) => {
      promise.then((result) => {
        results.push(result);
        if (results.length === promises.length) {
          resolve(results);
        }
      }).catch((error) => {
        reject(error);
      });
    });
  });
}
  1. 当所有promise都成功时,resolve新的Promise对象并返回包含所有promise结果的数组;否则直接reject新的Promise对象。
javascriptCopy Code
function myPromiseAll(promises) {
  let results = [];
  return new Promise((resolve, reject) => {
    promises.forEach((promise) => {
      promise.then((result) => {
        results.push(result);
        if (results.length === promises.length) {
          resolve(results);
        }
      }).catch((error) => {
        reject(error);
      });
    });
  }).catch((error) => {
    reject(error);
  });
}

示例代码

下面是一个使用myPromiseAll方法的示例代码:

javascriptCopy Code
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

const promises = [promise1, promise2, promise3];

myPromiseAll(promises).then((results) => {
  console.log(results); // [1, 2, 3]
}).catch((error) => {
  console.error(error);
});

结语

本文介绍了如何手动实现Promise.all方法。希望读者可以通过本文对JavaScript中的Promise有更加深入的理解。

转载自:https://juejin.cn/post/7225425984312901692
评论
请登录