Promise异步队列通过链式累积任务实现严格串行执行:以Promise.resolve()为起点,每次push用.then()追加返回Promise的任务函数,天然保证顺序、避免竞态;支持错误处理与done()通知,纯串行场景下最简可靠。

Promise 可以轻松实现一个异步任务队列,让多个异步操作按顺序串行执行,避免竞态、嵌套或手动管理状态。
核心思路:用 Promise 链式累积任务
关键在于维护一个“当前执行链”的 Promise 实例(初始为 Promise.resolve()),每新增一个异步任务,都基于它调用 .then() 追加,从而自然形成串行链。
- 每次添加任务时,不立即执行,而是返回一个新 Promise,该 Promise 在前一个任务完成后才开始执行当前任务
- 任务函数本身应返回 Promise(如
fetch、setTimeout封装等),确保可被链式消费 - 无需锁、计数器或额外状态变量,靠 Promise 的状态流转天然保证顺序
简易 Async Queue 实现
以下是一个轻量、可复用的队列类:
class AsyncQueue {
constructor() {
this.chain = Promise.resolve();
}
push(asyncFn) {
// asyncFn 应是一个无参函数,返回 Promise
this.chain = this.chain.then(() => asyncFn());
return this;
}
// 可选:清空队列(重置链)
reset() {
this.chain = Promise.resolve();
return this;
}
}
使用示例:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
const queue = new AsyncQueue();
queue
.push(() => delay(1000).then(() => console.log('1st')))
.push(() => delay(500).then(() => console.log('2nd')))
.push(() => Promise.reject(new Error('Oops!')));
// 输出:1s 后打印 '1st' → 0.5s 后打印 '2nd' → 抛出错误(后续任务不再执行)
其中 delay 是一个返回 Promise 的辅助函数:const delay = ms => new Promise(res => setTimeout(res, ms));
支持错误处理与任务完成通知
实际项目中常需捕获异常、统一兜底,或在全部任务结束后做清理。可在链尾加 .catch() 或暴露 done() 方法:
- 在
push中统一包裹.catch()可防止单个失败中断整个队列(即“软失败”) - 提供
done()返回最终 Promise,方便外层await或监听完成/失败 - 例如:增加
done()方法return this.chain;,调用方可用await queue.done();
进阶:带并发控制的队列(如最多同时跑 2 个)
若需“限制并发数 + 保持入队顺序”,就不能只靠单链。此时推荐用信号量(Semaphore)或封装 Promise.allSettled 分批调度。但注意:这已不属于纯“顺序执行”,而是“有序提交 + 并发执行”。真正严格串行,仍应坚持单 Promise 链方式,它最简、最可靠、最易调试。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










