js 实现异步队列
异步队列的实现方法
在JavaScript中实现异步队列可以通过多种方式完成,核心目标是确保任务按顺序执行,且每个任务完成后再处理下一个任务。以下是几种常见的方法:

使用Promise链式调用
通过Promise的链式调用特性,可以确保异步任务按顺序执行。每个任务的完成会触发下一个任务的开始。

class AsyncQueue {
constructor() {
this.queue = [];
this.isProcessing = false;
}
enqueue(task) {
return new Promise((resolve, reject) => {
this.queue.push({ task, resolve, reject });
if (!this.isProcessing) {
this.processQueue();
}
});
}
async processQueue() {
this.isProcessing = true;
while (this.queue.length > 0) {
const { task, resolve, reject } = this.queue.shift();
try {
const result = await task();
resolve(result);
} catch (error) {
reject(error);
}
}
this.isProcessing = false;
}
}
使用async/await和递归
通过递归调用处理队列中的任务,确保前一个任务完成后才处理下一个任务。
class AsyncQueue {
constructor() {
this.queue = [];
this.isProcessing = false;
}
enqueue(task) {
return new Promise((resolve, reject) => {
this.queue.push({ task, resolve, reject });
if (!this.isProcessing) {
this.processQueue();
}
});
}
async processQueue() {
if (this.queue.length === 0) {
this.isProcessing = false;
return;
}
this.isProcessing = true;
const { task, resolve, reject } = this.queue.shift();
try {
const result = await task();
resolve(result);
} catch (error) {
reject(error);
}
this.processQueue();
}
}
使用第三方库
如果项目允许使用第三方库,可以考虑使用async库或p-queue库,它们提供了更强大的异步队列功能。
const PQueue = require('p-queue');
const queue = new PQueue({ concurrency: 1 });
queue.add(() => fetch('https://api.example.com/data1'));
queue.add(() => fetch('https://api.example.com/data2'));
注意事项
- 错误处理:确保每个任务的错误被捕获并正确处理,避免队列因错误中断。
- 并发控制:如果需要限制同时执行的任务数量,可以通过设置并发数来实现。
- 性能优化:对于大量任务,可以考虑分批处理或使用更高效的数据结构。






