在 ES12 中,新增了 Promise.any() 方法,它与 Promise.all() 方法有些相似之处,但也存在不同之处。这篇文章将介绍 Promise.any() 和 Promise.all() 的区别、使用场景以及示例代码。
Promise.all() 的用法
Promise.all() 方法用于等待所有 Promise 都完成。当传入的所有 Promise 都成功执行后,Promise.all() 才会返回 Resolve 状态,返回值为所有 Promise 的结果组成的数组。如果传入的 Promise 中有任意一个失败,则 Promise.all() 将返回一个 Reject 状态的 Promise,返回值为第一个失败的 Promise 的结果。
下面是 Promise.all() 的例子:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - ------------- -- ----------------- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- ----------------- ------ --- ---------------------- ------------------------ -- - -------------------- -- --------- -------- ---
在上述例子中,我们创建了两个 Promise,分别是 promise1 和 promise2,它们都是通过 setTimeout 延时执行的。使用 Promise.all() 方法,将它们组成一个数组 [promise1, promise2],并等待它们都完成。当它们都完成后,Promise.all() 返回一个包含了它们的结果的数组 ['hello', 'world']。
Promise.any() 的用法
Promise.any() 方法用于等待传入的所有 Promise 中的任意一个执行成功。当参数中的所有 Promise 中有任意一个成功后,Promise.any() 将返回 Resolve 状态,返回值为该成功的 Promise 的结果。如果传入的所有 Promise 都失败,则 Promise.any() 将返回一个 Reject 状态的 Promise,返回值为包含所有 Promise 错误信息的数组。
下面是 Promise.any() 的例子:
-- -------------------- ---- ------- ----- -------- - --- ----------------- ------- -- - ------------- -- ---------- ------------ ----- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- ----------------- ------ --- ----- -------- - --- ----------------- ------- -- - ------------- -- ----------------- ------ --- ---------------------- --------- ----------------------- -- - ------------------- -- ------- ---------------- -- - ------------------- -- --------------- --- -------- -------- ---
在上述例子中,我们创建了三个 Promise,分别是 promise1、promise2 和 promise3,其中 promise1 的状态为 Reject,其余两个为 Resolve。使用 Promise.any() 方法,将它们组成一个数组 [promise1, promise2, promise3],并等待其中任意一个变成 Resolve 状态。因为 promise2 和 promise3 都是 Resolve 状态,所以 Promise.any() 返回一个成功的 Promise,其结果为 'world'。
Promise.all() 和 Promise.any() 的区别
返回值
Promise.all() 返回一个数组,包含所有传入 Promise 的结果,如果有一个 Promise 失败,它会立即停止并返回 Reject 状态。
Promise.any() 返回第一个成功状态的 Promise 结果,如果传入的所有 Promise 都失败,它将返回一个包含所有 Promise 错误信息的 AggregateError 对象,而不是直接返回一个错误信息。
执行顺序
Promise.all() 所有 Promise 都必须执行完毕才能返回结果,而 Promise.any() 只需要等待其中一个 Promise 成功即可返回结果。
总结
Promise.all() 用于等待所有 Promise 都完成时使用,而 Promise.any() 用于等待参数中的任意一项 Promise 完成时使用。我们可以根据业务需求来选择使用合适的方法。
参考资料
示例代码
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c5d42995c405902ee373a8