0

0

如何在 JavaScript 中并发执行多个 Promise 并按顺序获取结果

霞舞

霞舞

发布时间:2026-02-09 23:44:31

|

113人浏览过

|

来源于php中文网

原创

如何在 JavaScript 中并发执行多个 Promise 并按顺序获取结果

本文介绍如何使用 promise.all() 高效实现“并发执行、顺序返回”的 promise 处理模式,替代手动维护队列的复杂逻辑,兼顾性能与可读性。

在实际开发中,我们常遇到一类典型需求:同时发起多个异步任务(如 API 请求、数据库写入、延时处理),但要求最终结果严格按任务创建的原始顺序被消费或写入——例如日志归档、批量交易处理、流式数据入库等场景。此时,若简单使用 await 串行执行,将严重拖慢整体耗时;而若直接 await 每个独立 Promise,则无法保证顺序;手动实现队列调度(如原 PromiseQueue 类)又易引入竞态、内存泄漏和递归调用风险。

Promise.all() 正是为此类场景设计的标准解决方案:它接受一个 Promise 实例数组,并发启动所有任务,并在全部成功完成后,以原始数组索引顺序返回一个结果数组——天然满足“并发执行 + 顺序结果”的核心诉求。

以下是一个简洁、健壮、可直接落地的实现示例:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

function randomNumber(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

async function run() {
  const promises = [];

  // 模拟长时间运行的异步数据源(如 for await...of)
  // 注意:此处为简化演示改用普通 for 循环;真实场景中可配合 async iterator 封装
  for (let i = 0; i < 5; i++) {
    promises.push(
      (async () => {
        await sleep(randomNumber(300, 1000)); // 模拟不等长异步操作
        return { index: i, timestamp: Date.now() };
      })()
    );
  }

  try {
    // ✅ 并发执行所有 promise,结果严格按 promises 数组顺序排列
    const results = await Promise.all(promises);

    // 按序处理每个结果(如写入数据库、打印日志)
    results.forEach((result, idx) => {
      console.log(`[#${idx}] Received:`, result);
      // ✅ 此处可安全执行依赖顺序的操作,例如:
      // await db.insert('swaps', result);
    });
  } catch (error) {
    console.error('At least one promise rejected:', error);
    // 根据业务需要决定是否中断后续流程或降级处理
  }
}

run();

关键优势说明

Caktus AI
Caktus AI

Caktus AI 是一个专为学生和教师打造的教育工具,可以帮助论文写作、数学问题、编程助手、语言学习等等!

下载

立即学习Java免费学习笔记(深入)”;

  • 零额外状态管理:无需私有队列、递归调度器或 resolve 回调缓存,消除内存泄漏与竞态隐患;
  • 标准兼容、可预测:Promise.all() 是 ECMAScript 规范方法,行为稳定,调试工具友好;
  • 错误传播明确:任一 Promise 拒绝即立即 reject 整体结果,便于集中错误处理;
  • 天然支持 async/await:可直接 await Promise.all(...),代码扁平无嵌套。

⚠️ 注意事项

  • 若需部分失败仍继续,应改用 Promise.allSettled();
  • 若原始数据源为异步迭代器(如 for await (const item of getSwaps())),请先收集 Promise 到数组再调用 Promise.all(),避免在循环中过早触发执行(尤其当 getSwaps() 内部有副作用时);
  • Promise.all() 不改变 Promise 的执行时机——所有 Promise 在 push 时即已启动,因此务必确保 fn() 调用发生在 push 前(如示例中 (async () => {...})() 立即执行);
  • 结果数组长度恒等于输入数组长度,索引一一对应,可放心用于位置敏感逻辑(如批量更新时匹配主键)。

综上,面对“并发执行、顺序消费”的需求,优先选用 Promise.all() 是更专业、更可持续的技术选择。它用标准化、声明式的方式,取代了易错的手动队列调度,让异步逻辑回归清晰与可靠。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

541

2023.09.20

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

312

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

414

2023.10.12

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

366

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2089

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

354

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

328

2023.10.09

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

132

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.8万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号