返回

以 Promise.allSettled 组织异步操作的多线程协奏曲

前端

主旋律:使用 Promise.allSettled() 并行执行多个异步操作

在多线程编程中,我们经常需要并行执行多个任务,以提高整体效率。在 JavaScript 中,Promise.allSettled() 方法便能实现这一需求。它接受一个 Promise 数组作为参数,并返回一个 Promise,该 Promise 在所有传入的 Promise 都完成时被解析,无论结果是成功还是失败。

Promise.allSettled() 的关键优势在于它始终返回一个 Promise,无论传入的 Promise 是否成功执行。这使得它非常适合处理需要并发执行的任务,例如,同时发送多个网络请求或处理多个文件读取操作。

以下是 Promise.allSettled() 的基本用法:

const promises = [
  fetch('https://example.com/api/data'),
  fetch('https://example.com/api/data2'),
  fetch('https://example.com/api/data3')
];

Promise.allSettled(promises).then(results => {
  // 处理所有任务的结果,无论成功与否
  results.forEach(result => {
    if (result.status === 'fulfilled') {
      // 任务成功,获取结果
      const data = result.value;
      console.log(`Fetched data: ${data}`);
    } else {
      // 任务失败,获取错误信息
      const error = result.reason;
      console.error(`Error fetching data: ${error}`);
    }
  });
});

在这个示例中,我们使用 Promise.allSettled() 来并行执行三个网络请求。无论这些请求成功还是失败,Promise.allSettled() 都会返回一个 Promise,并在所有请求都完成时解析。

变奏曲:Promise.allSettled() 的其他妙用

除了基本用法之外,Promise.allSettled() 还有一些其他的妙用,可以帮助我们处理更复杂的异步任务。

1. 优雅地处理部分任务失败的情况

在某些情况下,我们可能希望并行执行多个任务,但即使其中一个任务失败,也不希望整个过程被中断。这时,Promise.allSettled() 就派上用场了。我们可以使用它来处理部分任务失败的情况,并继续执行其他任务。

const promises = [
  fetch('https://example.com/api/data'),
  fetch('https://example.com/api/data2'),
  fetch('https://example.com/api/data3')
];

Promise.allSettled(promises).then(results => {
  // 过滤出成功的任务结果
  const successfulResults = results.filter(result => result.status === 'fulfilled');

  // 处理成功的任务结果
  successfulResults.forEach(result => {
    const data = result.value;
    console.log(`Fetched data: ${data}`);
  });
});

在这个示例中,我们使用 Promise.allSettled() 并行执行三个网络请求。如果其中一个请求失败,Promise.allSettled() 仍然会返回一个 Promise,但这个 Promise 的结果将包含所有任务的结果,无论成功与否。我们可以通过过滤结果数组来获取成功的任务结果,并继续处理这些结果。

2. 测量并行任务的总执行时间

使用 Promise.allSettled(),我们可以轻松地测量并行任务的总执行时间。这是通过使用 Promise.allSettled() 的 race() 方法来实现的。

const startTime = performance.now();

const promises = [
  fetch('https://example.com/api/data'),
  fetch('https://example.com/api/data2'),
  fetch('https://example.com/api/data3')
];

Promise.allSettled(promises).race(() => {
  const endTime = performance.now();
  console.log(`Total execution time: ${endTime - startTime} ms`);
});

在这个示例中,我们使用 race() 方法来测量并行任务的总执行时间。race() 方法会在所有任务都完成时解析,无论成功与否。一旦 race() 方法解析,我们就计算并记录总执行时间。

尾声:Promise.allSettled() 的力量

总之,Promise.allSettled() 是 JavaScript 中一个非常强大的工具,它可以帮助我们并行执行多个异步操作,并以一致的方式处理所有任务的结果,无论成功与否。通过使用 Promise.allSettled(),我们可以提高应用程序的并发性,并轻松处理复杂的工作流。