介绍
在 JavaScript 的 Promise 中,Promise.all() 是一个非常常见的用来处理多个 Promise 的方法,但是在处理多个 Promise 的时候,我们通常只关心所有 Promise 是否都成功了,而不关心其中某一个 Promise 失败的情况。这就导致了一个问题,当其中一个 Promise 失败时,Promise.all() 就会立即返回一个以该 Promise 的错误信息为理由被拒绝的 Promise,而其它已经成功了的 Promise 的返回结果就被忽略了。这样很不方便,如果我们必须等待所有 Promise 都返回后才能继续后续操作,就需要借助 Promise.all() 的异常处理能力,但是这也非常不优雅。
在 ES9 中,新添加了一个方法:Promise.allSettled(),它能够同时返回成功和失败的 Promise,它需要等待所有的 Promise 都执行完毕,而不是像 Promise.all() 一样在第一个 Promise 失败时立即返回。
使用方法
Promise.allSettled() 接受一个数组参数,数组中的每一项都是一个 Promise 对象。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - ------------------------ ----- -------- - ------------------- ----- -------- - ---------- --------- ---------- ---------------------------- ------------- -- - --------------------- ---
在上面的代码中,我们定义了一个数组 promises
,其中包括了三个 Promise 对象,分别代表了一个成功的 Promise、一个失败的 Promise 和另一个成功的 Promise。
当我们执行 Promise.allSettled(promises)
时,它会等待所有 Promise 执行完毕,然后会将执行结果以 Promise 类型返回,同时 Promise 返回的结果是一个数组,数组中保存了每个 Promise 执行的结果。
Promise.allSettled() 返回结果
Promise.allSettled() 返回的 Promise 的结果是一个数组,数组中每一个元素都是一个对象,该对象包含了 Promise 的执行结果信息,格式如下:
{ status: 'fulfilled/rejected', value: '返回值/错误原因' }
- status:表示 Promise 的执行状态,可能为 fulfilled 或 rejected,分别代表着 Promise 执行成功或失败。
- value:如果 Promise 已成功执行,则为 Promise 的返回值;如果 Promise 执行失败,则为 Promise 的错误原因。
总结
Promise.allSettled() 是 ES9 新特性中的一个很实用的方法,它允许我们等待所有 Promise 执行完成后对每个 Promise 的执行结果进行处理,并且它不会在某一个 Promise 失败时终止后续执行。
下面是使用 Promise.allSettled() 方法解决多个 Promise 并发执行问题的简单示例:
-- -------------------- ---- ------- ----- -------- - ---------------------------- ----- -------- - ---------------------------- ----- -------- - --------------------------- ----------------------------- --------- ----------------------- -- - ----- ---------- - --------------------- -- ------------- --- ------------- ----- ------ - --------------------- -- ------------- --- ------------ ------------------------ ----------------------- -------------------- ------------------- ---
在上面的代码中,我们使用 Promise.allSettled() 方法同时发起了三个请求。当所有请求都处理完成后,我们过滤所有成功的请求和失败的请求,并分别输出它们的个数。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e4a70bf6b2d6eab301dfff