返回

一对一 拆解 Promise.all,手动串联 Promise

前端

理解 Promise.all

Promise.all 方法接收一个 Promise 对象数组作为参数,返回一个新的 Promise 对象。该新的 Promise 对象在数组中所有 Promise 都成功时才会成功,只要数组中有一个 Promise 失败,新的 Promise 对象就会失败。

Promise.all 的基本原理是:

  1. 创建一个新的 Promise 对象。
  2. 遍历 Promise 对象数组,并为每个 Promise 对象添加一个状态监听器。
  3. 当某个 Promise 对象成功时,将该 Promise 对象从 Promise 对象数组中移除,并检查是否所有 Promise 对象都已成功。
  4. 如果所有 Promise 对象都已成功,则新的 Promise 对象成功。
  5. 如果数组中任何一个 Promise 对象失败,则新的 Promise 对象失败。

手动实现 Promise.all

下面我们将演示如何手动实现 Promise.all 方法:

function myPromiseAll(promises) {
  return new Promise((resolve, reject) => {
    if (promises.length === 0) {
      resolve([]);
      return;
    }

    let completedCount = 0;
    const results = [];

    promises.forEach((promise, index) => {
      promise.then(
        (value) => {
          completedCount++;
          results[index] = value;
          if (completedCount === promises.length) {
            resolve(results);
          }
        },
        (error) => {
          reject(error);
        }
      );
    });
  });
}

这个函数接收一个 Promise 对象数组作为参数,并返回一个新的 Promise 对象。该新的 Promise 对象在数组中所有 Promise 都成功时才会成功,只要数组中有一个 Promise 失败,新的 Promise 对象就会失败。

使用手动实现的 Promise.all

我们可以使用手动实现的 Promise.all 方法来等待多个 Promise 对象的完成,例如:

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

myPromiseAll([promise1, promise2, promise3]).then((results) => {
  console.log(results); // [1, 2, 3]
});

总结

本文中,我们拆解了 Promise.all 的实现原理,并演示了如何手动实现 Promise.all 方法。通过手动实现 Promise.all,我们可以更好地理解其工作机制和使用方法。Promise.all 是 JavaScript 中一个非常有用的方法,可以帮助我们更轻松地处理异步任务。