js 实现异步队列
异步队列的实现方法
在JavaScript中,异步队列通常用于控制异步任务的执行顺序,确保任务按特定顺序或条件依次执行。以下是几种常见的实现方式:
使用Promise链式调用
通过Promise的链式调用特性,可以确保异步任务按顺序执行。每个任务完成后触发下一个任务。
function asyncQueue(tasks) {
return tasks.reduce((promiseChain, currentTask) => {
return promiseChain.then(chainResults =>
currentTask().then(currentResult =>
[...chainResults, currentResult]
)
);
}, Promise.resolve([]));
}
基于async/await的实现

利用async/await语法可以更直观地编写异步队列代码,保持代码的可读性。
async function asyncQueue(tasks) {
const results = [];
for (const task of tasks) {
results.push(await task());
}
return results;
}
使用队列数据结构

手动维护一个队列,通过递归或循环的方式依次处理队列中的任务。
class AsyncQueue {
constructor() {
this.queue = [];
this.isProcessing = false;
}
enqueue(task) {
this.queue.push(task);
if (!this.isProcessing) this.process();
}
async process() {
this.isProcessing = true;
while (this.queue.length > 0) {
const task = this.queue.shift();
await task();
}
this.isProcessing = false;
}
}
带并发控制的异步队列
限制同时执行的异步任务数量,避免资源过载。
async function asyncQueue(tasks, concurrency = 1) {
const results = [];
const executing = new Set();
for (const task of tasks) {
const p = task().then(res => {
executing.delete(p);
return res;
});
executing.add(p);
results.push(p);
if (executing.size >= concurrency) {
await Promise.race(executing);
}
}
return Promise.all(results);
}
注意事项
- 错误处理:需要为每个任务添加catch处理,避免单个任务失败导致整个队列中断
- 内存管理:长时间运行的队列需注意内存泄漏问题
- 取消机制:实现任务取消功能时需清除队列中未执行的任务
以上方法可根据具体需求选择使用,Promise链式调用适合简单场景,async/await代码更易读,队列类实现更灵活,并发控制适用于资源敏感场景。






