TypeScript 任务队列简介
\n\n任务队列 (task queue) 是编程中最基本的数据结构之一,它遵循"先进先出"(FIFO) 原则。在 TypeScript 中,任务队列广泛用于管理异步操作、处理请求、组织后台进程以及许多其他场景。
\n\n在本文中,我们将从零开始讲解如何在 TypeScript 中创建和使用任务队列。您将学习如何实现基本队列、添加优先级以及处理错误。本材料面向熟悉 TypeScript 基础的初学者开发者。
\n\n什么是任务队列以及为什么需要它?
\n\n队列是一个有序的元素列表,新元素的添加发生在末尾,而提取则从开头进行。想象一下商店里的队列:第一个顾客先被服务,新顾客则排在队尾。
\n\n在编程中,任务队列用于:
\n\n- \n
- 异步处理 — 在后台执行任务而不阻塞主线程 \n
- 负载管理 — 限制同时执行的操作数量 \n
- 事件处理 — 顺序处理传入的请求 \n
- 任务调度 — 延迟或按计划执行任务 \n
在 TypeScript 中实现基本任务队列
\n\n创建队列类
\n\n让我们从 TypeScript 中一个简单的队列实现开始。创建一个支持基本操作的 TaskQueue 类:
// task-queue.ts\ntype Task<T> = () => Promise<T>;\n\nclass TaskQueue<T> {\n private queue: Task<T>[] = [];\n private isProcessing = false;\n\n // 向队列添加任务\n enqueue(task: Task<T>): void {\n this.queue.push(task);\n if (!this.isProcessing) {\n this.processQueue();\n }\n }\n\n // 处理队列\n private async processQueue(): Promise<void> {\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const task = this.queue.shift()!;\n try {\n const result = await task();\n console.log('任务已完成:', result);\n } catch (error) {\n console.error('执行任务时出错:', error);\n }\n }\n\n this.isProcessing = false;\n }\n\n // 检查队列是否为空\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n // 获取队列大小\n size(): number {\n return this.queue.length;\n }\n}\n\n使用队列
\n\n现在让我们看看如何在实践中使用我们的类:
\n\n// example.ts\nconst taskQueue = new TaskQueue<string>();\n\n// 创建几个异步任务\nconst task1 = async () => {\n await delay(1000);\n return '第一个任务已完成';\n};\n\nconst task2 = async () => {\n await delay(500);\n return '第二个任务已完成';\n};\n\nconst task3 = async () => {\n await delay(200);\n return '第三个任务已完成';\n};\n\n// 将任务添加到队列\ntaskQueue.enqueue(task1);\ntaskQueue.enqueue(task2);\ntaskQueue.enqueue(task3);\n\n// 辅助函数\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// 结果:\n// 任务已完成:第一个任务已完成 (1秒后)\n// 任务已完成:第二个任务已完成 (1.5秒后)\n// 任务已完成:第三个任务已完成 (1.7秒后)\n\n带优先级的进阶队列
\n\n在实际项目中,经常需要处理不同优先级的任务。让我们扩展我们的队列,添加优先级支持:
\n\n// priorit