导读:本期聚焦于小伙伴创作的《JavaScript中如何并行执行多个异步任务?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript中如何并行执行多个异步任务?》有用,将其分享出去将是对创作者最好的鼓励。

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

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。