在 ES12 中,Promise 类型增加了两个新的方法:Promise.allSettled
和 Promise.any
。这些新方法在处理异步代码的时候能够给我们更好的控制和更高的优化。在本文中,我们将深入讲解这两个方法,以及它们如何在我们的代码中应用。
Promise.allSettled 方法
Promise.allSettled
方法会返回一个新的 Promise,它会等待所有的 Promise 对象都做完并 settled(成功或失败)时返回一个数组,包含每个 Promise 的结果或失败的原因。
下面是使用 Promise.allSettled
的示例代码:
const promiseOne = Promise.resolve("I'm resolved!") const promiseTwo = Promise.reject("I'm rejected!") const promiseThree = Promise.resolve("I'm also resolved!") Promise.allSettled([promiseOne, promiseTwo, promiseThree]) .then((results) => results.forEach((result) => console.log(result.status)))
输出结果:
fulfilled rejected fulfilled
由于 promiseTwo
被拒绝了,它的状态为 rejected
,而其他两个 Promise 都是成功的,因此它们的状态为 fulfilled
。然后,我们使用 forEach
遍历 results
数组来输出每个 Promise 的状态。
Promise.any 方法
Promise.any
方法也会返回一个 Promise,但是它与 Promise.allSettled
方法不同,它会等待任意一个 Promise 对象完成。如果传入的 Promise 对象中的任何一个 resolved(成功)了,这个方法就会返回那个 resolved 状态的 Promise;如果传入的所有 Promise 都被 rejected(失败),这个方法会返回一个 AggregateError,其中包含了所有的失败原因。
下面是使用 Promise.any
的示例代码:
const promiseOne = new Promise((resolve) => setTimeout(resolve, 1000, "I'm resolved after 1s!")) const promiseTwo = new Promise((resolve) => setTimeout(resolve, 3000, "I'm resolved after 3s!")) const promiseThree = Promise.reject("I'm rejected immediately!") Promise.any([promiseOne, promiseTwo, promiseThree]) .then((result) => console.log(result)) .catch((error) => console.log(error))
输出结果:
I'm resolved after 1s!
由于 promiseOne
是第一个 resolved 的 Promise,因此 Promise.any
返回了它的结果。如果在传入的 Promise 对象中所有 Promise 都被 rejected,那么我们将会看到一个 AggregateError,它包含了所有被 rejected 的原因。
拓展性
这两个方法提供了一些有用的拓展性,它们能够让我们更加精细地控制异步操作,并且减少了我们在处理异步代码时的复杂性。在未来,这种趋势将继续发展,我们可能会看到更多的 Promise API 出现,以解决更多的异步问题。
结论
Promise.allSettled 和 Promise.any 两个方法提供了强大的控制异步操作的功能,它们对于处理异步代码来说是一个有用的工具。我们希望这篇文章能够帮助你了解如何使用这些 API,并能够让你更加精细地控制你的异步操作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67062f1cd91dce0dc8598ef8