返回

透过Promise.allSettled深入剖析异步任务的处理

前端

Promise.allSettled的语法

Promise.allSettled(iterable)
  • iterable: 一个可迭代对象,其中包含要执行的异步任务的promise。

Promise.allSettled的返回值

Promise.allSettled返回一个promise,该promise在所有传入的promise都被解决后解析。返回值是一个数组,其中包含每个传入promise的结果。每个结果是一个对象,具有以下属性:

  • status: 表示promise的状态,可能是“fulfilled”或“rejected”。
  • value: 如果promise成功解决,则包含解决值;如果promise被拒绝,则包含拒绝原因。

Promise.allSettled的用法

Promise.allSettled通常用于处理多个异步任务并发运行的情况。例如,您可能希望并行下载多个文件,或者同时向多个API发送请求。使用Promise.allSettled,您可以轻松地等待所有任务完成,并获取所有任务的结果。

Promise.allSettled与Promise.all的区别

Promise.all与Promise.allSettled非常相似,但它们之间存在一些关键区别:

  • Promise.all: 如果传入的promise中有任何一个被拒绝,则Promise.all将立即被拒绝,并且不会等待其他promise完成。
  • Promise.allSettled: 即使传入的promise中有任何一个被拒绝,Promise.allSettled也会等待所有promise完成,并返回所有promise的结果。

Promise.allSettled的示例

下面是一个Promise.allSettled的示例:

const promises = [
  fetch('https://example.com/file1.txt'),
  fetch('https://example.com/file2.txt'),
  fetch('https://example.com/file3.txt')
];

Promise.allSettled(promises)
  .then((results) => {
    for (const result of results) {
      if (result.status === 'fulfilled') {
        console.log('File downloaded successfully:', result.value);
      } else {
        console.log('File download failed:', result.reason);
      }
    }
  });

在上面的示例中,我们使用Promise.allSettled并行下载三个文件。然后,我们使用.then()方法来处理所有promise的结果。对于每个promise,我们检查其状态,如果promise成功解决,则打印下载成功的消息和下载的文件内容;如果promise被拒绝,则打印下载失败的消息和拒绝原因。

结论

Promise.allSettled是一个用于处理异步任务的强大工具。它允许您同时执行多个异步任务,并获取所有任务的最终结果,无论它们是成功还是失败。通过使用Promise.allSettled,您可以更轻松地处理并发异步任务,并提高代码的可读性和可维护性。