推荐答案
// www.javascriptcn.com code example
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"]
});本题详细解读
1. 什么是 Promise.all?
Promise.all 是 JavaScript 中的一个静态方法,它接受一个可迭代对象(通常是数组)作为参数,数组中的每个元素都是一个 Promise 对象。Promise.all 会等待所有的 Promise 对象都成功完成(即变为 fulfilled 状态),然后返回一个新的 Promise 对象,该 Promise 对象的结果是一个数组,数组中的每个元素对应传入的 Promise 对象的结果。
2. 如何使用 Promise.all?
传入一个 Promise 数组:
Promise.all接受一个 Promise 数组作为参数。数组中的每个元素可以是一个 Promise 对象,也可以是一个非 Promise 值(如数字、字符串等),这些非 Promise 值会被自动转换为已完成的 Promise。等待所有 Promise 完成:
Promise.all会等待所有的 Promise 都完成(即变为fulfilled状态)。如果其中任何一个 Promise 被拒绝(即变为rejected状态),Promise.all会立即返回一个被拒绝的 Promise,并且不会等待其他 Promise 完成。返回结果数组:如果所有的 Promise 都成功完成,
Promise.all返回的 Promise 对象的结果是一个数组,数组中的每个元素对应传入的 Promise 对象的结果。
3. 示例代码解析
// www.javascriptcn.com code example
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"]
});promise1:这是一个已经完成的 Promise,结果为3。promise2:这是一个非 Promise 值42,会被自动转换为一个已完成的 Promise。promise3:这是一个延迟 100 毫秒后完成的 Promise,结果为'foo'。
Promise.all 会等待所有的 Promise 完成,然后返回一个包含所有结果的数组 [3, 42, "foo"]。
4. 错误处理
如果 Promise.all 中的任何一个 Promise 被拒绝,Promise.all 会立即返回一个被拒绝的 Promise,并且不会等待其他 Promise 完成。你可以使用 .catch 方法来处理错误:
Promise.all([promise1, promise2, promise3])
.then((values) => {
console.log(values);
})
.catch((error) => {
console.error(error);
});5. 适用场景
Promise.all 适用于需要并行执行多个异步操作,并且需要等待所有操作都完成后再进行下一步处理的场景。例如,同时发起多个网络请求,并在所有请求都完成后处理返回的数据。