ES2020 新特性:Promise.allSettled() 与 Promise.any()

阅读时长 5 分钟读完

简介

随着 JavaScript 应用不断扩大和复杂度上升,Promise 成为了一种非常重要的异步编程工具。随着 ES2020 的到来,Promise 增加了两个新的方法:Promise.allSettled() 和 Promise.any()。

Promise.allSettled() 解决了 Promise.all() 的一些限制,它返回所有 Promise 都已经 settle 的数组,包括 resolved 和 rejected,而不是只有当所有的 Promise 都 resolved 或者有一个 rejected 时才返回。

Promise.any() 返回第一个 settled 的 Promise(resolved 或 rejected),而不是像 Promise.race() 那样返回第一个完成(resolved 或 rejected)的 Promise。

这两个新方法对于前端开发中处理异步操作时非常有用。

Promise.allSettled()

Promise.allSettled() 方法接受一个 Promise 数组,并返回一个新的 Promise,该 Promise 解析为一个数组,其元素是每个指定的 Promise 执行结果的描述符对象,包括状态和结果值。

语法如下:

其中 iterable 为一个可迭代对象,如数组。

返回值如下所示:

其中每个描述符对象有两个属性,一个是 status,表示 Promise 的状态,它有两个值:fulfilled(解析)或 rejected(拒绝);另一个是 value 或 reason,表示 Promise resolve 或 reject 的值。

下面是一个使用 Promise.allSettled() 的示例代码:

-- -------------------- ---- -------
----- -------- - -
  -------------------
  -------------------------
  ------------------
--

----------------------------
  --------------- -- -
    ------------------------ -- -
      -------------------------- ------------ -- ---------------
    ---
  ---

输出结果为:

上面的代码中,即使 Promise.reject() 产生了一个 rejected Promise, Promise.allSettled() 仍然会返回一个由所有 Promise 处理结果组成的数组,而不会抛出一个错误。

Promise.any()

Promise.any() 方法同样接受一个 Promise 数组,并返回一个新的 Promise 实例。只要参数数组中的 Promise 之一被解析,Promise.any() 就会解析,并返回解析的 Promise 的值。

语法如下:

其中 iterable 为一个可迭代对象,如数组。

返回值为第一个完成的 Promise 的值,不管是 resolve 还是 reject。

下面是一个使用 Promise.any() 的示例代码:

-- -------------------- ---- -------
----- -------- - -
  --- ----------------- ------- -- ------------------ ----- ----------
  --- ----------------- ------- -- ------------------- ---- -----------
  --- ----------------- ------- -- ------------------- ---- ---------
--

---------------------
  -------------- -- --------------------
  -------------- -- --------------------

输出结果为:

上面的代码中,Promise.any() 会等待传入的 Promise 数组中的某个 Promise 状态变更,并解析为该 Promise 的值。

注意事项

有一些需要注意的地方:

  • Promise.allSettled() 不支持 IE11 及以下版本。
  • Promise.any() 还没有被所有主流浏览器所支持,使用之前请进行兼容性测试。

结论

Promise 是 JavaScript 中非常实用的一个功能,两个新方法 Promise.allSettled() 和 Promise.any() 提供了对 Promise 功能的扩展,使得开发者们可以更好地掌控异步操作。

参考资料

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6775f6f06d66e0f9aa07f2bc

纠错
反馈