使用 ES2021 的新特性实现一种实用的异步等待函数

在前端开发中,经常会遇到需要等待异步操作完成后才能继续执行的情况,如请求数据、读取文件等。在 ES2021 中,引入了新的异步等待函数 Promise.allSettled(),可以方便地等待多个异步操作完成后再执行下一步操作。本文将介绍如何使用 Promise.allSettled() 实现一种实用的异步等待函数,并提供示例代码。

Promise.allSettled() 的用法

Promise.allSettled() 是 ES2021 新引入的异步等待函数,它接收一个 Promise 数组作为参数,返回一个 Promise 对象。该 Promise 对象在所有 Promise 对象都完成后才会被 resolved。不同于 Promise.all(),即使其中某个 Promise 对象被 rejected,Promise.allSettled() 仍然会等待其它 Promise 对象完成后再执行。

Promise.allSettled() 返回的 Promise 对象的值是一个对象数组,数组中的每个对象都表示一个 Promise 对象。每个对象都有一个 status 属性,表示 Promise 对象的状态,可能的值为 "fulfilled""rejected";还有一个 valuereason 属性,分别表示 Promise 对象的返回值或错误原因。

下面是一个示例,演示了如何使用 Promise.allSettled() 等待多个 Promise 对象完成:

const promises = [
  Promise.resolve('Promise 1'),
  Promise.reject(new Error('Promise 2 error')),
  Promise.resolve('Promise 3')
];

Promise.allSettled(promises)
  .then(results => {
    results.forEach(result => {
      if (result.status === 'fulfilled') {
        console.log('Promise fulfilled:', result.value);
      } else {
        console.log('Promise rejected:', result.reason);
      }
    });
  });

上述示例中,Promise.allSettled() 接收一个包含三个 Promise 对象的数组,其中第二个 Promise 对象被 reject。在 then() 方法中,我们可以遍历结果数组,判断每个 Promise 对象的状态和值。

实现一个异步等待函数

基于 Promise.allSettled() 的特性,我们可以实现一个实用的异步等待函数,用于等待多个异步操作完成后再执行下一步操作。下面是一个示例实现:

async function waitAll(promises) {
  const results = await Promise.allSettled(promises);
  const fulfilled = results.filter(result => result.status === 'fulfilled');
  const rejected = results.filter(result => result.status === 'rejected');
  return { fulfilled, rejected };
}

上述代码中,我们定义了一个名为 waitAll() 的异步函数,它接收一个 Promise 数组作为参数。在函数内部,我们使用 Promise.allSettled() 等待所有 Promise 对象完成,并将结果存入 results 数组中。然后,我们使用 filter() 方法分别筛选出已完成和已拒绝的 Promise 对象,并将它们存入 fulfilledrejected 数组中。最后,我们返回一个对象,包含 fulfilledrejected 两个数组。

使用该函数的示例如下:

const promises = [
  fetch('https://jsonplaceholder.typicode.com/todos/1'),
  fetch('https://jsonplaceholder.typicode.com/todos/2'),
  fetch('https://jsonplaceholder.typicode.com/todos/3')
];

waitAll(promises)
  .then(({ fulfilled, rejected }) => {
    console.log('Fulfilled:', fulfilled);
    console.log('Rejected:', rejected);
  });

上述示例中,我们使用 fetch() 方法获取三个 JSON 数据,并将它们存入一个 Promise 数组中。然后,我们调用 waitAll() 函数等待所有 Promise 对象完成,并在 then() 方法中打印已完成和已拒绝的 Promise 对象。

总结

本文介绍了 ES2021 中新引入的异步等待函数 Promise.allSettled() 的用法,并提供了一个示例实现一个实用的异步等待函数。使用该函数可以方便地等待多个异步操作完成后再执行下一步操作,提高了前端开发的效率和可靠性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658ce0d2eb4cecbf2d2b5e72


纠错
反馈