ES9:从 allSettled 和 any 到 globalThis

阅读时长 4 分钟读完

ES9,也就是 ECMAScript 2018,是 JavaScript 标准的最新版本,于 2018 年 6 月正式发布。本篇文章将介绍 ES9 新增的两个方法 allSettled 和 any,以及新增的全局对象 globalThis。

allSettled

在 ES9 之前,Promise 的 all 方法只要有一个 Promise 被 reject,整个 Promise.all 返回的 Promise 就会立刻 reject,导致剩余 Promise 的结果并不会返回。而 allSettled 则允许在所有 Promise 完成后将其结果返回,不会因为其中某个 Promise 被 reject 而导致中断。

allSettled 的使用方法与 all 类似,只是返回的 Promise 对象有所不同。allSettled 返回的 Promise 需要使用 then 方法来获取结果,其 resolve 回调函数将返回所有 Promise 的执行结果(无论 resolve 或 reject),每个结果都包含了 Promise 对象本身的状态。

以下是一个 allSettled 使用示例:

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

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

结果将输出:

any

any 方法与 all 方法一样,都需要接收一个 Promise 数组,不同的是,any 只要有一个 Promise 对象 resolve,就立即返回该 Promise 的 resolve 值,并且不会等待其他 Promise 完成。如果所有 Promise 对象都 reject,则会返回一个 AggregateError 类型的错误,内部包含所有 reject 原因的列表。

以下是一个 any 使用示例:

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

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

在上面的示例中,第二个 Promise 会比第一个 Promise 快执行,所以 any 返回的结果是第二个 Promise 的 reject 值,即 p2 reject

globalThis

在 ES9 中,全局对象 globalThis 被添加到了语言规范中。全局对象是 JavaScript 运行时的顶层对象,在不同的环境中(Web 端或 Node.js),顶层对象分别是 window 和 global。我们要获取顶层对象时,需要使用不同的方式,这会让代码在不同的环境中变得不兼容。

例如,在浏览器中,我们使用 window.alert('hello') 来弹出一个消息框,而在 Node.js 中,我们需要使用 global.alert('hello')。这就需要在运行时检查当前环境,使用不同的对象。

有了 globalThis,我们就可以统一使用 globalThis 对象来获取全局对象,无论在什么环境中,都可以使用相同的代码。

以下是一个使用 globalThis 的示例:

总结

本文介绍了 ES9 中引入的两个新方法 allSettled 和 any,以及新增的全局对象 globalThis。allSettled 允许我们获取所有 Promise 的执行结果(无论 resolve 或 reject),不会因为其中某个 Promise 被 reject 而导致中断;而 any 则可以在多个 Promise 对象中只返回第一个 resolve 的结果,这个结果即为 Promise 对象 resolve 的值。全局对象 globalThis 可以帮助我们在不同的环境中获取顶层对象,达到代码兼容的目的。

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

纠错
反馈