什么是 Promise.allSettled()?
Promise.allSettled() 是 ES2020(或 ES8)引入的一个新方法,它接受一个 Promise 数组作为参数,并返回一个 Promise,该 Promise 在所有传入的 Promise 都已解析之后才解析,而不像 Promise.all() 在任何一个 Promise 被拒绝时就拒绝。
返回的 Promise 将解析为一个数组,其中包含所有传入的 Promise 的状态,每个状态都是包含以下属性的对象:
- status: 对应每个 Promise 的状态,可能的值为
fulfilled
或rejected
- value: 如果状态是 fulfilled,则为解析的值;如果状态是 rejected,则为拒绝的原因
如何使用 Promise.allSettled()?
使用 Promise.allSettled() 可以轻松地处理一组异步操作,并获取每个操作的结果,无论成功或失败。
例如,我们可以使用 Promise.allSettled() 获取多个 HTTP 请求的结果:
-- -------------------- ---- ------- ----- ---- - - ------------------------------------ ------------------------------------ ------------------------------------ -- ----- -------- - ------------ -- ------------ ---------------------------- --------------- -- - -------------------------- -- - -- ---------------- --- ------------ - ---------------------------- - ---- - ------------------------------- - --- ---
这段代码创建了一个包含三个 URL 的数组,并使用 fetch()
方法发出了三个 HTTP 请求。然后,使用 map()
方法将每个 URL 转换为一个 Promise,并将这些 Promise 存储在 requests
数组中。最后,Promise.allSettled(requests)
方法将这些 Promise 作为参数传递,并返回一个新的 Promise。
当所有的 Promise 解析完毕时,Promise.allSettled()
解析的 Promise 将被解析,并将一个对象数组传递给处理程序。在此示例中,我们使用 forEach()
方法遍历该数组,并根据每个 Promise 的状态进行相应的操作。
与 Promise.all() 的比较
与 Promise.all() 不同,Promise.allSettled() 不会在任何一个 Promise 被拒绝时就拒绝。因此,即使其中一些 Promise 被拒绝,仍然可以处理其余的 Promise。
例如,如果我们将上面的示例更改为使用 Promise.all():
Promise.all(requests) .then(responses => { responses.forEach(response => console.log(response)); }) .catch(error => console.error(error));
如果其中一个请求被拒绝,Promise.all()
将立即拒绝并返回该错误。这意味着即使其中两个请求成功了,它们也无法被处理。
总结
Promise.allSettled() 是一个有用的新方法,可以处理多个异步操作,并获取每个操作的结果,无论是成功还是失败。它在 ES8 中引入,并已成为现代 JavaScript 的一个重要功能。
与 Promise.all() 不同,Promise.allSettled() 不会在任何一个 Promise 被拒绝时拒绝,这意味着即使其中一些 Promise 被拒绝,仍然可以处理其余的 Promise。
示例代码:####
Promise.all(requests) .then(responses => { responses.forEach(response => console.log(response)); }) .catch(error => console.error(error));
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64525e54968c7c53b06fcf90