在前端开发中,经常会用到 Promise 这个异步编程的工具。Promise.all() 是一个非常常见的用法,它可以把多个 Promise 实例包装成一个新的 Promise 实例,当所有的 Promise 实例都成功时,返回的新 Promise 实例才会成功;当其中任意一个 Promise 实例失败时,返回的新 Promise 实例就会失败。然而,Promise.all() 存在一个问题,就是只要有一个 Promise 实例失败,就会立即终止,后面的 Promise 实例就不会再执行了。这在某些场景下是不合适的,比如需要等待所有 Promise 实例都执行完毕后再进行下一步操作的情况。ES10 中新增的 Promise.allSettled() 方法就是为了解决这个问题的。
Promise.allSettled() 的用法
Promise.allSettled() 的用法和 Promise.all() 类似,也是把多个 Promise 实例包装成一个新的 Promise 实例,并返回一个数组,数组中的每个成员都是一个对象,表示对应的 Promise 实例的执行结果。这个对象有两个属性:status 和 value。status 是字符串,表示 Promise 实例的状态,可能为 "fulfilled"(表示成功)或 "rejected"(表示失败);value 是 Promise 实例返回的结果,如果 Promise 实例成功,它就是 Promise 实例的返回值,如果 Promise 实例失败,它就是 Promise 实例抛出的错误对象。
下面是 Promise.allSettled() 的示例代码:
const p1 = Promise.resolve(1); const p2 = Promise.reject(new Error("error")); const p3 = Promise.resolve(3); Promise.allSettled([p1, p2, p3]).then(results => { console.log(results); });
输出结果:
[ { status: "fulfilled", value: 1 }, { status: "rejected", reason: Error: error at <anonymous>:2:20 }, { status: "fulfilled", value: 3 } ]
可以看到,Promise.allSettled() 返回了一个数组,数组中的每个成员都是一个对象,表示对应的 Promise 实例的执行结果。其中第一个 Promise 实例成功,返回了值 1;第二个 Promise 实例失败,抛出了一个错误对象;第三个 Promise 实例成功,返回了值 3。
Promise.allSettled() 的指导意义
Promise.allSettled() 的出现,解决了 Promise.all() 的一个痛点,让开发者能够更加灵活地处理多个 Promise 实例的执行结果。比如,在某些场景下,我们需要等待多个异步操作全部完成后再进行下一步操作,而这些异步操作可能并不是全部成功的,有些可能会失败。这时候,Promise.allSettled() 就能派上用场了。我们可以通过遍历 Promise.allSettled() 返回的数组,判断每个异步操作的状态,根据实际情况进行下一步操作。
下面是一个示例代码,演示了如何使用 Promise.allSettled() 处理多个异步操作的情况:
-- -------------------- ---- ------- ----- ---- - - ----------------------------------------------- ----------------------------------------------- ---------------------------------------------- -- ----- -------- - ------------ -- ------------ ---------------------------- ------------- -- - ------------------------ -- -- - -- -------------- --- ------------ - -------------------- --- - -- ------------ -------------- - ---- - -------------------- --- - -- --------- --------------- - --- -- ------------ -- - ---------------------- ---- -------- ------- ---展开代码
这段代码中,我们首先定义了一个数组 urls,其中包含了三个 API 地址。然后,我们使用 Array.map() 方法把这三个地址转换成三个 Promise 实例,放到一个数组 requests 中。接下来,我们使用 Promise.allSettled() 方法,等待 requests 中的所有 Promise 实例执行完毕后返回一个数组。最后,我们遍历这个数组,根据每个 Promise 实例的状态,输出相应的信息。
结论
ES10 中新增的 Promise.allSettled() 方法,解决了 Promise.all() 在处理多个 Promise 实例时只要有一个失败就会立即终止的问题,让开发者能够更加灵活地处理多个异步操作的结果。在实际开发中,我们可以根据具体场景,选择使用 Promise.all() 或 Promise.allSettled(),以达到最佳的效果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6758187b5b8c5cbb5f7c0092