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 使用示例:
-- -------------------- ---- ------- ----- -------- - - ------------------------- ----- ------------------------ ----- ------------------------- ----- -- ----------------------------------------- -- - ---------------------- -- - --------------------------- --- ---
结果将输出:
fulfilled rejected fulfilled
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 的示例:
globalThis.setTimeout(() => { console.log('5 seconds passed.'); }, 5000);
总结
本文介绍了 ES9 中引入的两个新方法 allSettled 和 any,以及新增的全局对象 globalThis。allSettled 允许我们获取所有 Promise 的执行结果(无论 resolve 或 reject),不会因为其中某个 Promise 被 reject 而导致中断;而 any 则可以在多个 Promise 对象中只返回第一个 resolve 的结果,这个结果即为 Promise 对象 resolve 的值。全局对象 globalThis 可以帮助我们在不同的环境中获取顶层对象,达到代码兼容的目的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b1efce48841e9894e4a8dd