js 实现消息队列
实现消息队列的基本思路
使用 JavaScript 实现消息队列的核心是利用数组或链表结构存储消息,并通过先进先出(FIFO)的原则处理消息。消息队列通常包含入队(enqueue)和出队(dequeue)操作,以及队列状态监控等功能。

基于数组的简单消息队列
class MessageQueue {
constructor() {
this.queue = [];
}
enqueue(message) {
this.queue.push(message);
}
dequeue() {
return this.queue.shift();
}
isEmpty() {
return this.queue.length === 0;
}
size() {
return this.queue.length;
}
}
基于链表的消息队列
链表实现可以避免数组 shift() 操作的高时间复杂度(O(n)),提升性能。

class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class LinkedListMessageQueue {
constructor() {
this.head = null;
this.tail = null;
this.length = 0;
}
enqueue(value) {
const newNode = new Node(value);
if (!this.head) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
this.length++;
}
dequeue() {
if (!this.head) return null;
const value = this.head.value;
this.head = this.head.next;
this.length--;
if (this.length === 0) this.tail = null;
return value;
}
isEmpty() {
return this.length === 0;
}
size() {
return this.length;
}
}
支持异步处理的扩展消息队列
结合 Promise 或 async/await 实现异步消息处理,适用于需要等待任务完成的场景。
class AsyncMessageQueue {
constructor() {
this.queue = [];
this.resolveMap = new Map();
}
enqueue(message) {
return new Promise((resolve) => {
if (this.resolveMap.size === 0) {
this.queue.push(message);
resolve();
} else {
const oldestResolve = this.resolveMap.keys().next().value;
oldestResolve(message);
this.resolveMap.delete(oldestResolve);
}
});
}
dequeue() {
return new Promise((resolve) => {
if (this.queue.length > 0) {
resolve(this.queue.shift());
} else {
this.resolveMap.set(resolve, true);
}
});
}
}
使用场景示例
消息队列适用于任务调度、事件处理、缓冲请求等场景。例如,在 Web 应用中处理高并发请求时,可以用消息队列缓冲任务。
const queue = new MessageQueue();
// 生产者
queue.enqueue("Task 1");
queue.enqueue("Task 2");
// 消费者
while (!queue.isEmpty()) {
const task = queue.dequeue();
console.log("Processing:", task);
}
性能优化与注意事项
- 避免频繁内存操作:链表实现更适合高频入队/出队场景。
- 错误处理:增加队列溢出或空队列处理的逻辑。
- 并发控制:多线程环境下需使用锁机制(如 Web Worker 的原子操作)。





