📜  promise.allsettled polyfill 节点 - Javascript (1)

📅  最后修改于: 2023-12-03 15:03:52.525000             🧑  作者: Mango

Promise.allSettled Polyfill

在标准Promise中,有一个非常受欢迎和实用的方法Promise.all,它用于接收多个Promise实例,返回一个线性数组结果。但是,尽管很常用,但它只有在所有Promise实例都是解决状态时才会生效。如果存在拒绝状态,则该方法会立即拒绝并返回拒绝错误原因。

Promise.allSettled是ECMAScript 2020的新增方法,它存在的目的是克服上述限制,即接受所有的Promise实例,不管其状态是“已解决”或“已拒绝”,只要Promise实例处理完毕,它就会执行并返回其结果。

然而,由于该方法是全新的,许多浏览器不支持它,而在一些较旧的浏览器中,可能无法使用JavaScript最新语法。这是在这些情况下使用Polyfill的好选择,为开发人员提供一种替代方法,以允许您使用Promise.allSettled() 方法。

## 实现Promise.allSettled()的Polyfill

虽然Promise.allSettled()方法是一个全新的特性,但是我们可以很容易地使用一个函数来模仿它的行为。以下是一个简单的自定义实现Promise.allSettled()的Polyfill的示例:

```javascript
if (!Promise.allSettled) {
  Promise.allSettled = function (promises) {
    return Promise.all(
      promises.map(function (promise) {
        return promise
          .then(function (value) {
            return { state: "fulfilled", value: value };
          })
          .catch(function (reason) {
            return { state: "rejected", reason: reason };
          });
      })
    );
  };
}

以上是一个处理参数的函数,该函数会确保所有传递给它的Promise都被执行并返回结果。如果一个Promise是“已解决”,则状态字段的值为“fulfilled”,结果存储在价值字段中;如果是“已拒绝”状态,则状态字段的值为“rejected”,原因存储在reason字段中。

在上述代码段中,我们使用Array.prototype.map()方法从传递的Promise数组中创建了一个新的Promise数组。然后我们使用.then()方法处理每个Promise实例,并在解决时改为存储在新的对象中。如果Promise实例是拒绝状态,则我们使用.catch()方法存储在新的对象中。

最后,我们使用 Promise.all() 方法来处理这些新 Promise实例的数组,这将返回一个Promise实例,该实例包含所有Promise实例的解决结果。

由于这个Polyfill覆盖了全局Promise对象,所以我们只需要在代码中使用Promise.allSettled()即可。如果该方法在JavaScript环境中存在,则会执行原始实现,否则会使用Polyfill实现。

## 结论

在所有新的JavaScript特性中,Promise.allSettled()提供了一个非常实用的功能。虽然它是一个相对较新的方法,但它确实提供了一个非常强大的特性,可以帮助开发人员更容易地针对处理多个异步任务。

如果您使用的浏览器不支持Promise.allSettled(),则可以使用上述Polyfill代码来模拟其行为。这样,您就可以在旧的JavaScript环境中使用这个有用的方法,以便您的代码可以运行在更广泛的环境中。