推荐答案
Promise.any 是 ECMAScript 2021 引入的一个方法,它接收一个包含多个 Promise 对象的可迭代对象(如数组),并返回一个新的 Promise。这个新的 Promise 会在传入的任何一个 Promise 成功(fulfilled)时立即成功,并返回该成功的值。如果所有的 Promise 都失败(rejected),则返回一个 AggregateError,其中包含所有 Promise 的失败原因。
本题详细解读
1. 基本用法
// www.javascriptcn.com code example
const promise1 = Promise.reject("Error 1");
const promise2 = Promise.resolve("Success 2");
const promise3 = Promise.reject("Error 3");
Promise.any([promise1, promise2, promise3])
.then((result) => {
console.log(result); // 输出: "Success 2"
})
.catch((error) => {
console.error(error); // 不会执行,因为至少有一个 Promise 成功
});在这个例子中,Promise.any 接收了一个包含三个 Promise 的数组。尽管 promise1 和 promise3 都失败了,但 promise2 成功了,因此 Promise.any 返回的 Promise 会成功,并输出 "Success 2"。
2. 所有 Promise 都失败的情况
// www.javascriptcn.com code example
const promise1 = Promise.reject("Error 1");
const promise2 = Promise.reject("Error 2");
const promise3 = Promise.reject("Error 3");
Promise.any([promise1, promise2, promise3])
.then((result) => {
console.log(result); // 不会执行,因为所有 Promise 都失败
})
.catch((error) => {
console.error(error); // 输出: AggregateError: All promises were rejected
console.error(error.errors); // 输出: ["Error 1", "Error 2", "Error 3"]
});在这个例子中,所有的 Promise 都失败了,因此 Promise.any 返回的 Promise 会失败,并抛出一个 AggregateError,其中 errors 属性包含了所有 Promise 的失败原因。
3. 与 Promise.race 的区别
Promise.any 和 Promise.race 的区别在于:
Promise.race会在第一个 Promise 完成(无论是成功还是失败)时立即返回。Promise.any则会在第一个 Promise 成功时返回,只有在所有 Promise 都失败时才会返回失败。
// www.javascriptcn.com code example
const promise1 = Promise.reject("Error 1");
const promise2 = Promise.resolve("Success 2");
Promise.race([promise1, promise2])
.then((result) => {
console.log(result); // 不会执行,因为第一个 Promise 失败
})
.catch((error) => {
console.error(error); // 输出: "Error 1"
});
Promise.any([promise1, promise2])
.then((result) => {
console.log(result); // 输出: "Success 2"
})
.catch((error) => {
console.error(error); // 不会执行,因为至少有一个 Promise 成功
});在这个例子中,Promise.race 会因为 promise1 的失败而立即返回失败,而 Promise.any 则会因为 promise2 的成功而返回成功。
4. 使用场景
Promise.any 适用于以下场景:
- 当你有多个异步操作,并且只要有一个成功就可以继续执行时。
- 当你希望在所有操作都失败时,能够获取到所有失败的原因。
例如,在多个数据源中获取数据时,只要有一个数据源返回了有效数据,就可以继续处理,而不需要等待所有数据源都返回结果。