在JavaScript的异步编程场景中,我们经常需要同时处理多个并行的异步任务,比如同时请求多个接口获取不同数据,这时候Promise.all()就能派上用场。它可以将多个Promise实例包装成一个新的Promise实例,等待所有传入的Promise都完成后再返回结果。

Promise.all()的基本语法
Promise.all()接收一个可迭代对象作为参数,通常我们使用数组来传入多个Promise实例,它的基本语法如下:
// 基本语法 Promise.all(iterable) // iterable:一个可迭代对象,比如数组,数组中的每个元素可以是Promise实例,也可以是其他值 // 返回值:一个新的Promise实例
基础使用示例
下面通过一个简单的例子展示Promise.all()的基础用法,同时模拟两个异步任务,等待它们都完成后获取结果:
// 模拟第一个异步请求,1秒后返回结果
const promise1 = new Promise((resolve) => {
setTimeout(() => {
resolve('任务1完成');
}, 1000);
});
// 模拟第二个异步请求,2秒后返回结果
const promise2 = new Promise((resolve) => {
setTimeout(() => {
resolve('任务2完成');
}, 2000);
});
// 使用Promise.all处理两个并行任务
Promise.all([promise1, promise2])
.then((results) => {
// results是一个数组,顺序和传入的Promise顺序一致
console.log(results); // 输出:['任务1完成', '任务2完成']
})
.catch((error) => {
console.error('发生错误:', error);
});参数与返回值说明
关于Promise.all()的参数和返回值,有几个需要注意的点:
- 传入的数组如果包含非Promise值,这些值会被直接放到结果数组中,不需要等待异步完成
- 返回的新Promise的状态由传入的所有Promise共同决定:只有当所有Promise都变为fulfilled状态,新Promise才会变为fulfilled,结果是一个按传入顺序排列的结果数组
- 只要有一个传入的Promise变为rejected状态,新Promise就会立即变为rejected,并且错误信息是第一个被拒绝的Promise的错误原因
错误处理规则
Promise.all()的错误捕获有一个特点,就是只要有一个Promise失败,就会直接触发catch回调,不会等待其他Promise完成。下面的例子可以说明这个行为:
const promiseA = new Promise((resolve) => {
setTimeout(() => {
resolve('A完成');
}, 1000);
});
const promiseB = new Promise((_, reject) => {
setTimeout(() => {
reject('B失败');
}, 500);
});
const promiseC = new Promise((resolve) => {
setTimeout(() => {
resolve('C完成');
}, 1500);
});
Promise.all([promiseA, promiseB, promiseC])
.then((res) => {
console.log('成功结果:', res);
})
.catch((err) => {
// 因为promiseB 500毫秒就失败,所以会直接走到这里,不会等待A和C完成
console.log('捕获错误:', err); // 输出:捕获错误:B失败
});常见使用场景
Promise.all()在实际开发中有很多适用场景,比如:
- 同时请求多个接口,等待所有数据都返回后再渲染页面,避免页面出现部分数据缺失的情况
- 并行执行多个数据库查询操作,所有查询完成后再进行后续的数据处理
- 同时加载多个静态资源(如图片、脚本),全部加载完成后再执行初始化逻辑
注意事项
使用Promise.all()时需要注意以下问题:
- 如果传入的数组为空,Promise.all()会立即返回一个fulfilled状态的Promise,结果是一个空数组
- 不要传入包含永远不会settled(既不会resolve也不会reject)的Promise,这会导致Promise.all()永远处于pending状态
- 如果需要处理多个异步任务,即使部分任务失败也要获取所有任务的结果,Promise.all()并不适用,这种场景可以考虑使用Promise.allSettled()
总结
Promise.all()是JavaScript中处理并行异步任务的高效工具,掌握它的语法、返回值特点和错误处理规则,能帮助我们更合理地组织异步代码。在实际使用时,要根据业务场景判断是否需要所有任务都成功,再决定是否使用Promise.all(),避免因为单个任务失败导致所有结果都无法获取的问题。
Promise.allJavaScript异步编程Promise修改时间:2026-05-24 23:15:04