UNPKG

@clownlee/queue

Version:

JS 前端多批次,多任务队列

79 lines (68 loc) 1.75 kB
import { single } from "./single"; import { sleep } from "./queue"; import type { Queue } from "./queue"; class QueueClass { tasks: MainTask[] = []; status: MainTaskStatus = "idle"; config: MainTaskConfig = { interval: 10000, } /** * 构造函数 * @param {MainTaskConfig} config 任务配置 */ constructor(config?: MainTaskConfig) { if (config) { this.config = config; } } /** * 获取所有任务 * @returns {MainTask[]} all tasks */ getTasks(): MainTask[] { return this.tasks; } /** * 清空所有任务 */ clearTask(): void { this.tasks = []; } /** * 添加任务,将删除队列中原有的同id任务 * @param {MainTask} task 任务 */ addTask(task: MainTask): void { this.removeTask(task.id); this.tasks.push(task); } /** * 删除指定任务id 的任务 * @param {MainTaskId} id */ removeTask(id: MainTaskId): void { this.tasks = this.tasks.filter((t) => t.id !== id); } /** * 常驻执行任务 * @param queue 队列 * @param {Function} fn 任务处理函数 * @returns {Promise<void>} 返回空 Promise */ async execute(queue: Queue, fn: Function = () => {}): Promise<void> { if (this.status === "running") { return; } this.status = "running"; while (true) { if (Object.keys(this.tasks).length > 0 && ['idle', 'termination'].includes(queue.status)) { const res = this.tasks.shift() // selFns.material(res?.params.vs, res?.params.info, queue) fn(res, queue) } await sleep(this.config.interval) } } } export const MainQueue = single(QueueClass);