AllSettled详解

发布时间:2023-05-19

一、allSettled兼容

allSettled 是 ES2020 新增的 API,用于将多个 Promise 实例封装成一个 Promise 实例,等到所有的 Promise 实例都返回结果,不管是成功还是失败,包装实例才会结束。但是由于是新增的 API,不同的浏览器、Node.js 系统版本兼容性可能存在差异。以下是代码示例,保证在不同环境下都能正常运行:

const allSettled =
  Promise.allSettled ||
  function (promises) {
    return Promise.all(
      promises.map((promise) =>
        Promise.resolve(promise).then(
          (value) => ({
            state: 'fulfilled',
            value,
          }),
          (reason) => ({
            state: 'rejected',
            reason,
          }),
        ),
      ),
    );
  };

二、allsettled怎么读

allSettled 是由 all(全部)和 settled(已解决)两个单词组成的,因此读作“all settled”,意为全部已解决。

三、allSettled翻译

allSettled 的翻译可以是“所有已完成”、“全部已解决”等,都与其含义相近。

四、allSettled返回顺序

allSettled 返回的结果是一个包含所有 Promise 实例的状态和结果的数组,数组的每个元素都是一个对象,其中包含 state 属性(fulfilledrejected)和对应的 valuereason。 当所有 Promise 实例都成功完成时,返回的数组中所有元素的 state 属性都为 fulfilledvalue 属性对应的是 Promise 实例的结果。 当至少有一个 Promise 实例失败时,返回的数组中所有元素的 state 属性都为 rejectedreason 属性对应的是 Promise 实例失败的原因。 并且,allSettled 返回的结果的顺序与 Promise 实例数组的顺序一一对应,即第一个 Promise 实例的状态和结果对应返回数组的第一个元素,第二个 Promise 实例对应第二个元素,以此类推。

五、allSettled的应用场景

allSettled 可以用于多个 Promise 实例的并行调用并且对结果统一处理时,比如将多个接口请求封装成 Promise 实例,使用 allSettled 对所有接口返回的数据进行统一处理。 此外,allSettled 还可以用于某些场景下的错误处理。在使用 Promise.all 的情况下,一旦有一个 Promise 实例失败,整个 Promise.all 返回的 Promise 实例就会失败,导致其它 Promise 实例的结果都被忽略。而 allSettled 则不会忽略任何一个 Promise 实例的状态和结果,我们可以根据需要对所有 Promise 实例的状态和结果进行分别处理。

// 将多个接口请求封装成Promise实例
const promise1 = fetch('/api/xxx1');
const promise2 = fetch('/api/xxx2');
const promise3 = fetch('/api/xxx3');
// 使用allSettled对所有接口返回的数据进行统一处理
Promise.allSettled([promise1, promise2, promise3])
  .then(results => {
    // 遍历所有Promise实例的结果
    results.forEach(result => {
      // 根据Promise实例的状态和结果进行分别处理
      if (result.state === 'fulfilled') {
        // 成功处理
        console.log(result.value);
      } else {
        // 失败处理
        console.log(result.reason);
      }
    });
  });

六、总结

allSettled 是 ES2020 新增的 API,用于将多个 Promise 实例封装成一个 Promise 实例,等到所有的 Promise 实例都返回结果,不管是成功还是失败,包装实例才会结束。allSettled 返回的结果是一个包含所有 Promise 实例的状态和结果的数组,数组的每个元素都是一个对象,其中包含 state 属性(fulfilledrejected)和对应的 valuereason