TypeScript 任务队列:创建与处理优化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在TypeScript中处理任务队列:完整指南

在现代Web开发和服务器应用程序中,经常需要异步、在后台或限制并发地执行任务。任务队列(task queues)是一种强大的模式,可以组织可预测且高效的操作执行。在本文中,我们将详细讨论如何在TypeScript中创建和使用任务队列,从简单实现到具有优先级和错误处理的高级技术。



什么是任务队列以及为什么需要它?

任务队列是一种数据结构,按照FIFO(先进先出)原则工作。任务被添加到队列末尾,并从开头取出。在TypeScript和Node.js的上下文中,队列用于:

  • 限制并发 — 控制同时执行的操作数量(例如,具有限制的API请求)。
  • 异步处理 — 在后台执行繁重任务而不阻塞主线程。
  • 重试 — 自动重新启动失败的任务并带有延迟。
  • 顺序管理 — 保证依赖操作的顺序执行。

TypeScript添加了严格的类型检查,使队列代码更加可靠和可预测。



TypeScript中任务队列的基本实现

我们从创建一个简单但完全类型化的队列开始。它将接受任务(返回Promise的函数)并按顺序执行它们。

// 定义任务类型type Task<T> = () => Promise<T>;

// 队列类class TaskQueue<T> { private queue: Task<T>[] = []; private isProcessing: boolean = false;

// 将任务添加到队列 enqueue(task: Task<T>): void { this.queue.push(task); this.process(); }

// 启动处理 private async process(): Promise<void> { if (this.isProcessing) return; this.isProcessing = true;

while (this.queue.length > 0) { const task = this.queue.shift()!; try { const result = await task(); console.log('任务完成:', result); } catch (error) { console.error('任务执行错误:', error); } }

this.isProcessing = false; }}

// 使用示例const queue = new TaskQueue<string>();queue.enqueue(async () => { await new Promise(resolve => setTimeout(resolve, 1000)); return '第一个任务';});queue.enqueue(async () => '第二个任务(快速)');

这个实现保证了顺序执行,并在添加新任务时自动启动处理。然而,它不支持并发和优先级。



具有并发限制的队列

通常需要同时执行多个任务,但不超过特定限制(例如,5个并行请求)。让我们添加concurrency参数。

class ParallelTaskQueue<T> {    private queue: Task<T>[] = [];    private activeCount: number = 0;    private readonly concurrency: number;

constructor(concurrency: number = 3) { this.concurrency = concurrency; }

enqueue(task: Task<T>): void { this.queue.push(task); this.processNext(); }

private processNext(): void { while (this.activeCount < this.concurrency && this.queue.length > 0) { const task = this.queue.shift()!; this.activeCount++; task() .then(result => console.log('成功:', result)) .catch(error => console.error('错误:', error)) .finally(()

博客

书籍推荐