当前位置:首页 > JavaScript

js 实现一个任务队列

2026-03-02 01:21:59JavaScript

实现任务队列的基本思路

任务队列的核心是管理异步任务的顺序执行,通常需要支持任务添加、执行控制(如并发限制)、错误处理等功能。以下是几种常见实现方式:

基础版:顺序执行异步任务

创建一个队列数组,逐个执行任务,前一个任务完成后再执行下一个:

class TaskQueue {
  constructor() {
    this.queue = [];
    this.isRunning = false;
  }

  addTask(task) {
    this.queue.push(task);
    if (!this.isRunning) this.run();
  }

  async run() {
    this.isRunning = true;
    while (this.queue.length > 0) {
      const task = this.queue.shift();
      try {
        await task();
      } catch (error) {
        console.error('Task failed:', error);
      }
    }
    this.isRunning = false;
  }
}

// 使用示例
const queue = new TaskQueue();
queue.addTask(() => new Promise(resolve => setTimeout(() => { console.log('Task 1'); resolve(); }, 1000)));
queue.addTask(() => new Promise(resolve => setTimeout(() => { console.log('Task 2'); resolve(); }, 500)));

进阶版:控制并发数

限制同时执行的任务数量,避免资源过载:

class ConcurrentQueue {
  constructor(concurrency = 1) {
    this.queue = [];
    this.concurrency = concurrency;
    this.running = 0;
  }

  addTask(task) {
    this.queue.push(task);
    this.next();
  }

  next() {
    while (this.running < this.concurrency && this.queue.length) {
      const task = this.queue.shift();
      this.running++;
      task().finally(() => {
        this.running--;
        this.next();
      });
    }
  }
}

// 使用示例(并发数为2)
const queue = new ConcurrentQueue(2);
for (let i = 1; i <= 5; i++) {
  queue.addTask(() => new Promise(resolve => 
    setTimeout(() => { console.log(`Task ${i}`); resolve(); }, 1000)
  ));
}

功能增强版:支持优先级

通过优先级字段调整任务执行顺序:

class PriorityQueue {
  constructor() {
    this.queue = [];
  }

  addTask(task, priority = 0) {
    this.queue.push({ task, priority });
    this.queue.sort((a, b) => b.priority - a.priority);
  }

  async run() {
    while (this.queue.length > 0) {
      const { task } = this.queue.shift();
      try {
        await task();
      } catch (error) {
        console.error('Task failed:', error);
      }
    }
  }
}

// 使用示例
const queue = new PriorityQueue();
queue.addTask(() => console.log('Low priority'), 1);
queue.addTask(() => console.log('High priority'), 3);
queue.run();

错误处理与重试

为任务添加自动重试机制:

js 实现一个任务队列

class RetryQueue {
  constructor(maxRetries = 3) {
    this.queue = [];
    this.maxRetries = maxRetries;
  }

  addTask(task) {
    this.queue.push(task);
  }

  async run() {
    for (const task of this.queue) {
      let retries = 0;
      while (retries <= this.maxRetries) {
        try {
          await task();
          break;
        } catch (error) {
          retries++;
          if (retries > this.maxRetries) console.error('Max retries reached:', error);
        }
      }
    }
  }
}

应用场景建议

  • 顺序执行:适合依赖前序结果的场景(如API串行调用)。
  • 并发控制:适用于资源密集型操作(如文件上传)。
  • 优先级队列:需要处理高优先级任务的场景(如用户交互响应)。
  • 重试机制:网络请求等可能临时失败的操作。

根据实际需求选择或组合上述方案。

标签: 队列任务
分享给朋友:

相关文章

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

vue实现定时任务

vue实现定时任务

实现定时任务的几种方法 在Vue中实现定时任务可以通过多种方式,以下是几种常见的实现方法: 使用setInterval 在Vue组件的mounted生命周期钩子中设置setInterval,在bef…

php 队列实现

php 队列实现

使用数据库实现队列 在PHP中可以通过数据库表模拟队列行为,创建包含id、data、status和created_at字段的表。插入数据时状态设为pending,消费时更新为processing,完成…

js 实现异步队列

js 实现异步队列

异步队列的实现方法 在 JavaScript 中,实现异步队列可以通过多种方式,以下是几种常见的方法: 使用 Promise 链式调用 通过 Promise 的链式调用可以确保异步任务按顺序执行。每…

js队列实现

js队列实现

队列的基本概念 队列是一种先进先出(FIFO)的数据结构,支持在队尾添加元素(入队),在队头移除元素(出队)。JavaScript中可通过数组或链表实现队列。 基于数组的实现 利用数组的push和s…

js 实现队列

js 实现队列

队列的基本概念 队列是一种先进先出(FIFO)的数据结构,支持从尾部插入元素(入队)和从头部移除元素(出队)。以下是 JavaScript 中实现队列的几种方法。 使用数组实现队列 数组…