推荐答案
// www.javascriptcn.com code example
// Promise.all 示例
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values); // [3, 42, "foo"]
});
// Promise.race 示例
const promise4 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise5 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise4, promise5]).then((value) => {
console.log(value); // "two"
});本题详细解读
Promise.all
Promise.all 方法接收一个包含多个 Promise 对象的数组作为参数,并返回一个新的 Promise 对象。这个新的 Promise 对象在所有传入的 Promise 对象都成功解决(resolved)时才会被解决。如果其中任何一个 Promise 被拒绝(rejected),则整个 Promise.all 返回的 Promise 对象会立即被拒绝。
- 成功情况:当所有 Promise 都成功解决时,
Promise.all返回的 Promise 对象会以一个包含所有 Promise 解决值的数组作为解决值。 - 失败情况:如果任何一个 Promise 被拒绝,
Promise.all返回的 Promise 对象会立即被拒绝,并且拒绝原因与第一个被拒绝的 Promise 相同。
Promise.race
Promise.race 方法同样接收一个包含多个 Promise 对象的数组作为参数,并返回一个新的 Promise 对象。这个新的 Promise 对象会在传入的 Promise 对象中有一个率先解决(无论是成功还是失败)时被解决。
- 解决情况:
Promise.race返回的 Promise 对象会以第一个解决(无论是成功还是失败)的 Promise 的解决值或拒绝原因作为自己的解决值或拒绝原因。
使用场景
- Promise.all:适用于需要等待多个异步操作全部完成后再进行下一步操作的场景。例如,同时发起多个 API 请求,并在所有请求都返回结果后再进行处理。
- Promise.race:适用于需要从多个异步操作中获取最快响应的场景。例如,设置一个超时机制,如果某个操作在指定时间内没有完成,则使用另一个操作的结果。
注意事项
Promise.all和Promise.race都接受一个可迭代对象(如数组)作为参数,但通常使用数组。- 如果传入的数组为空,
Promise.all会立即解决为一个空数组,而Promise.race会永远挂起,不会解决或拒绝。