在 Javascript 中,使用 Promise 进行异步编程已经成为了标准的做法。但在实际应用中,经常遇到需要并发处理多个 Promise 的情况,而 Promise.all() 方法只要有一个 Promise 状态变为 rejected,就会立即返回。这时候我们就需要使用 ES9 中新增的 Promise.allSettled() 方法。
Promise.allSettled() 方法
Promise.allSettled() 方法接收一个 Promise 数组作为参数,返回一个 Promise 对象,它会在所有 Promise 都完成后才会结束。与 Promise.all() 不同的是,无论 Promise 状态为 fulfilled 或 rejected,Promise.allSettled() 都会将所有 Promise 的状态收集起来,作为一个数组返回。
-- -------------------- ---- ------- ----- -------- - - ------------------------- -------- ------------------ --------------- --------- -- ----------------------------------------- -- - --------------------- --- -- ------- -- ------- ------------ ------ --------- ------ -- - ------- ----------- ------- ----- --
可以看到,Promise.allSettled() 方法返回的数组中,每个元素都包含一个 status 属性,用于表示 Promise 的状态。如果状态为 fulfilled,那么该元素还会有一个 value 属性,表示 Promise 的返回值;如果状态为 rejected,那么该元素还会有一个 reason 属性,表示 Promise 的失败原因。
Promise.allSettled() 的应用
使用 Promise.allSettled() 可以优雅地处理多个 Promise 的并发处理。例如,我们需要同时向三个不同的服务器请求数据,但其中任意一个服务器出现故障都会导致整个应用崩溃。这时候我们可以使用 Promise.allSettled() 来处理:
-- -------------------- ---- ------- ----- -------- - - ---------------- ---------------- --------------- -- ----------------------------------------- -- - ----- ---------------- - --------------------- -- ------------- --- ----------------------- -- -------------- ----- --------------- - --------------------- -- ------------- --- ---------------------- -- --------------- -- ----------------------- - -- - ------------------- -- ----- ---- ---- ------------------------- -- ---------------- ------ - ---------------- -------- ----------- ------------------ ---
这样就可以保证即使有某一个服务器出现故障,整个应用也不会崩溃,同时我们也可以很方便地获取所有的成功响应和失败原因。
总结
ES9 中新增的 Promise.allSettled() 方法可以优雅地处理多个 Promise 的并发处理,并能够获取所有 Promise 的状态。在实际应用中,Promise.allSettled() 也是一个非常实用的工具。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64671eb6968c7c53b0785317