Promise.all
是 JavaScript 中 Promise
对象的一个静态方法,用于并行处理多个异步操作。它接受一个可迭代对象(通常是一个数组)作为参数,该对象包含多个 Promise 对象,并返回一个新的 Promise 对象。
主要功能和用法
并行处理多个 Promise:
Promise.all
可以同时执行多个 Promise,等所有 Promise 都完成后,才会将结果返回。-
返回结果:
- 当所有 Promise 全部成功时,返回一个新的 Promise,其中的值是一个数组,数组的每一项对应于输入的 Promise 结果,顺序与输入的 Promise 顺序一致。
- 如果任一 Promise 被拒绝(即状态变为拒绝),
Promise.all
将返回一个拒绝状态的 Promise,拒绝的原因是第一个被拒绝的 Promise 的原因。
语法
Promise.all(iterable);
-
参数:
iterable
是一个可迭代对象(如数组),包含多个 Promise。 - 返回值:一个 Promise,表示所有输入 Promise 的结果。
示例
const promise1 = Promise.resolve(3);
const promise2 = 42; // 这个值会被自动转换为一个 resolved Promise
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log(values); // [3, 42, "foo"]
})
.catch(error => {
console.error('One of the promises failed:', error);
});
错误处理
如果有一个 Promise 失败:
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 100, 'Error!');
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log(values);
})
.catch(error => {
console.error('One of the promises failed:', error); // 'One of the promises failed: Error!'
});
注意事项
-
短路:一旦有一个 Promise 被拒绝,
Promise.all
就会立即返回拒绝状态的 Promise,后续的 Promise 将不再被等待。 - 顺序一致:即使某些 Promise 的完成时间不同,返回结果的顺序仍然与调用时的顺序一致。
总结
Promise.all
是处理多个并行异步操作的强大工具,能够简化代码并提高性能。在使用时,需要注意错误处理和 Promise 的返回顺序。