UNPKG

whale-plus

Version:

A Component Library for Vue 3

1 lines 4.85 kB
{"version":3,"file":"TaskQueue.mjs","sources":["../../../../../../packages/upload-sdk/src/upload-core/TaskQueue.ts"],"sourcesContent":["// 任务构造器\nimport { EventEmitter } from './EventEmitter';\n\nexport class Task {\n fn: any; // 任务关联的执行函数\n payload?: any; // 任务关联的其他信息\n constructor(fn: any, payload?: any) {\n this.fn = fn;\n this.payload = payload;\n }\n\n // 执行任务\n run() {\n return this.fn(this.payload);\n }\n}\n\n// 可并发执行的任务队列\nexport class TaskQueue extends EventEmitter<'start' | 'pause' | 'drain'> {\n // 待执行的任务\n private tasks: Set<Task> = new Set();\n // 当前正在执行的任务数\n private currentCount = 0;\n // 任务状态\n private status: 'paused' | 'running' = 'paused';\n // 最大并发数\n private concurrency = 4;\n\n constructor(concurrency = 4) {\n super();\n this.concurrency = concurrency;\n }\n\n // 添加任务\n add(...tasks: Task[]) {\n for (const t of tasks) {\n this.tasks.add(t);\n }\n }\n\n // 添加任务并启动执行\n addAndStart(...tasks: Task[]) {\n this.add(...tasks);\n this.start();\n }\n\n // 启动任务\n start() {\n if (this.status === 'running') {\n return; // 任务正在进行中,结束\n }\n if (this.tasks.size === 0) {\n // 当前已无任务,触发drain事件\n this.emit('drain');\n return;\n }\n // 设置任务状态为running\n this.status = 'running';\n this.emit('start'); // 触发start事件\n this.runNext(); // 开始执行下一个任务\n }\n\n // 取出第一个任务\n private takeHeadTask() {\n const task = this.tasks.values().next().value;\n if (task) {\n this.tasks.delete(task);\n }\n return task;\n }\n\n // 执行下一个任务\n private runNext() {\n if (this.status !== 'running') {\n return; // 如果整体的任务状态不是running,结束\n }\n if (this.currentCount >= this.concurrency) {\n // 并发数已满,结束\n return;\n }\n // 取出第一个任务\n const task = this.takeHeadTask();\n if (!task) {\n // 没有任务了\n this.status = 'paused'; // 暂停执行\n this.emit('drain'); // 触发drain事件\n return;\n }\n this.currentCount++; // 当前任务数+1\n // 执行任务\n Promise.resolve(task.run()).finally(() => {\n // 任务执行完成后,当前任务数-1,继续执行下一个任务\n this.currentCount--;\n this.runNext();\n });\n }\n\n // 暂停任务\n pause() {\n this.status = 'paused';\n this.emit('pause');\n }\n}\n"],"names":[],"mappings":"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"}