javascript异步队列本质是用数组或promise链实现fifo调度:数组方案需维护任务函数数组并递归await执行;promise链方案通过动态.then()拼接自动排队;增强版支持暂停、取消与状态查询;须避免并发执行、未捕获异常及非promise定时器。

JavaScript 中的异步队列本质是用数组或类数组结构配合 Promise 链或微任务机制,让异步任务按添加顺序逐个执行,实现真正的 FIFO 调度。
用数组 + async/await 模拟串行 FIFO 队列
最直观的方式是维护一个任务数组,每次只运行队首任务,并在它完成后移除、执行下一个。关键在于避免并发,确保“前一个结束”才触发“后一个”。
- 定义一个空数组 queue 存储待执行的异步函数(注意:存的是函数,不是调用结果)
- 提供 push(task) 方法把新任务加到数组末尾
- 内部用递归或循环 + await 控制执行节奏:取出第一个函数并调用,等待其 Promise 完成后再处理下一个
- 示例中可封装成类,用私有变量 #running 防止重复启动,保证单线程调度
利用 Promise 链动态拼接实现自动排队
不显式维护数组,而是让每个新任务自动追加到前一个任务的 .then() 尾部。这样天然形成链式 FIFO 顺序,且无需手动轮询或递归。
- 初始化一个空的 Promise 变量(如 chain = Promise.resolve())
- 每次添加任务时:chain = chain.then(() => task())
- 所有任务会按调用 push 的顺序依次进入链,不会提前执行
- 适合轻量级场景;缺点是无法暂停、取消中间任务,也不易获取当前队列长度
支持取消、暂停和状态查询的增强队列
真实项目常需控制力更强的队列。可在基础 FIFO 上扩展方法:
- pause():设标志位,执行完当前任务后暂不取下一个
- resume():清除暂停标志,继续递归执行
- cancel(index):从内部数组中删除指定位置任务(注意索引变化)
- length 属性返回剩余未执行任务数;isIdle 判断是否空闲
- 每个任务可返回带 abort 方法的 Promise,用于外部中断(需任务本身支持 AbortController)
注意事项与常见误区
FIFO 异步队列看似简单,但容易踩坑:
- 不要直接 forEach 或 for...of 遍历任务数组并 await —— 这会并发执行,失去队列意义
- 避免在任务内部抛出未捕获异常,否则整个队列会中断;建议统一用 .catch() 或 try/catch 包裹
- 定时器(如 setTimeout)或事件回调加入队列时,要确保它们返回 Promise,否则 await 会立即向下执行
- UI 渲染敏感场景中,可插入 await Promise.resolve() 让出主线程,防止长时间阻塞
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











