在 ES2020 中,Promise.allSettled() 是一个新的方法,它可以接收多个 Promise 对象并同时等待它们全部执行完毕。与 Promise.all() 不同的是,在任何一个 Promise 对象状态变更时,Promise.allSettled() 都会继续执行并返回一个数组,其中包含所有 Promise 对象的执行结果及其执行状态。
语法
Promise.allSettled(iterable)
参数:
- iterable:一个可迭代对象,通常是由多个 Promise 对象组成的数组;
返回值:一个数组,由多个对象组成,每个对象代表一个 Promise 对象的执行结果及其状态信息。每个对象都包含以下属性:
status
:Promise 对象的执行状态,字符串类型,包括 "fulfilled"(已完成)和 "rejected"(已拒绝)两种状态;value
:Promise 对象的执行结果,如果status
为 "fulfilled" 则为函数的返回值,否则为错误对象。
使用示例
下面是一个简单的示例,用来模拟同时加载多个图片资源的场景:
-- -------------------- ---- ------- ----- ---------- - ------ -- - ----- -------- - -------------- -- - ------ --- ----------------- ------- -- - ----- ----- - --- -------- ------------ - -- -- - --------- ---- ------- -------- --- -- ------------- - -- -- - --------- ---- ------- ------- --- -- --------- - ---- --- --- ------ ------------------------------------------- -- - ------ -------- --- -- ----- ---- - ------------------------------------------------------------- ------------------------------------------------------------ ------------------------------------------------------------- ------------------------------- -- - --------------------- ---
在上面的代码中,我们首先定义了一个 loadImages()
函数,它将一个由多个图片资源地址组成的数组作为参数,并通过循环创建多个 Promise 对象来加载图片资源。在每个 Promise 对象的执行结束之后,我们都会将其执行结果用一个包含 url
和 status
两个属性的对象表示,并通过 resolve()
方法传递给 Promise 对象的处理函数。
最后,我们使用 Promise.allSettled() 方法将所有的 Promise 对象进行汇总,并通过 then()
方法获取全部 Promise 对象执行的结果。
使用限制
尽管 Promise.allSettled() 方法很方便,但它也存在一些使用限制:
- Promise.allSettled() 方法是 ES2020 标准中新增的方法,不兼容低版本浏览器。在使用前,需要先检查当前环境是否支持该方法,如果不支持可以使用第三方 Promise 处理库来代替;
- Promise.allSettled() 方法返回的结果数组中,无法区分那些 Promise 对象未能顺利执行,不能像 Promise.all() 中那样通过 Promise 异常捕获来进行错误处理;
- 在处理大量 Promise 对象时,Promise.allSettled() 的性能比 Promise.all() 差,因为它需要依次遍历每个 Promise 对象,获得其执行结果和状态,并将它们放入执行结果数组中。如果 Promise 对象数量较少,则两个方法的性能差异可以忽略不计,但是当 Promise 对象数量较多时,应优先考虑使用 Promise.all() 方法。
总结
ES2020 中新增的 Promise.allSettled() 方法,是一个处理多个 Promise 对象的方便工具,它不仅可以快速获取所有 Promise 对象的执行结果和状态,还可以将它们统一封装成对象数组,并直接传递给下一个 Promise 处理函数进行下一步操作。
在使用 Promise.allSettled() 方法时,需要注意该方法的使用限制,以便在实际开发中更好地发挥它的作用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f0510ff6b2d6eab3a4f168