在JavaScript的单线程模型下,异步任务的处理效率直接影响程序性能,当需要同时处理多个互不依赖的异步操作时,并行执行是更优的选择。下面先通过一张示意图了解并行执行异步任务的基本逻辑:

一、使用Promise.all实现并行执行
Promise.all是最常用的并行执行多个异步任务的方法,它接收一个包含多个Promise的数组,当所有Promise都成功兑现时,返回一个包含所有结果的数组;只要有一个Promise被拒绝,就会立即抛出错误,不再等待其他任务完成。
下面是一个使用Promise.all并行请求两个接口的例子:
// 模拟异步请求函数
function fetchData(url) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(`从${url}获取到的数据`);
}, 1000);
});
}
// 并行执行两个请求
Promise.all([
fetchData('https://ipipp.com/api/data1'),
fetchData('https://ipipp.com/api/data2')
]).then((results) => {
console.log('两个请求都成功,结果:', results);
// 输出:两个请求都成功,结果: ["从https://ipipp.com/api/data1获取到的数据", "从https://ipipp.com/api/data2获取到的数据"]
}).catch((error) => {
console.error('有请求失败:', error);
});适用场景
- 多个异步任务互不依赖,且需要所有任务都成功才能继续后续逻辑
- 比如同时请求多个必要的基础数据,缺一个就无法渲染页面
注意事项
- 如果其中一个任务失败,整个Promise.all会立即 reject,其他未完成的任务不会中断,但结果不会被捕获
- 传入的数组元素如果不是Promise,会被自动转换为Promise再执行
二、使用Promise.allSettled处理可能失败的任务
如果希望即使有异步任务失败,也能拿到所有任务的最终状态(成功或失败),可以使用Promise.allSettled。它同样接收Promise数组,等待所有任务完成后,返回一个包含每个任务状态和结果的对象数组。
示例代码如下:
function fetchDataWithError(url, isError = false) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (isError) {
reject(`请求${url}失败`);
} else {
resolve(`从${url}获取到的数据`);
}
}, 1000);
});
}
Promise.allSettled([
fetchDataWithError('https://ipipp.com/api/data1'),
fetchDataWithError('https://ipipp.com/api/data2', true)
]).then((results) => {
results.forEach((item, index) => {
if (item.status === 'fulfilled') {
console.log(`任务${index}成功,结果:`, item.value);
} else {
console.log(`任务${index}失败,原因:`, item.reason);
}
});
});适用场景
- 多个异步任务中部分失败不影响整体,需要统计所有任务的最终状态
- 比如批量上传文件,需要记录哪些上传成功、哪些失败
三、结合async/await简化并行代码
在使用async/await语法时,如果直接await多个异步任务,会串行执行,要实现并行需要先将任务启动,再统一await结果。常见的方式是先执行所有异步任务得到Promise数组,再用Promise.all包裹await。
错误串行写法示例:
async function wrongParallel() {
const result1 = await fetchData('https://ipipp.com/api/data1'); // 等待1秒
const result2 = await fetchData('https://ipipp.com/api/data2'); // 再等待1秒,总共2秒
console.log(result1, result2);
}正确并行写法示例:
async function correctParallel() {
// 先启动两个异步任务,不立即await
const promise1 = fetchData('https://ipipp.com/api/data1');
const promise2 = fetchData('https://ipipp.com/api/data2');
// 同时等待两个任务完成,总共耗时1秒左右
const [result1, result2] = await Promise.all([promise1, promise2]);
console.log(result1, result2);
}四、不同方法的选择建议
| 方法 | 特点 | 适用场景 |
|---|---|---|
| Promise.all | 所有任务成功才返回,一个失败就终止 | 任务必须全部成功才能继续的场景 |
| Promise.allSettled | 等待所有任务完成,返回所有状态 | 需要统计所有任务成功失败情况的场景 |
| async/await + Promise.all | 语法更简洁,符合同步代码阅读习惯 | 大部分需要并行执行异步任务的场景 |
实际开发中可以根据任务之间的依赖关系和对失败处理的容忍度,选择合适的并行执行方案,提升代码的执行效率。
JavaScript异步任务并行执行Promise_allasync_await修改时间:2026-05-29 03:19:33