-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAsyncTaskQueue.ts
More file actions
67 lines (63 loc) · 2.18 KB
/
AsyncTaskQueue.ts
File metadata and controls
67 lines (63 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* @Description: 实现一个`AsyncTaskQueue`, 用于管理异步任务的执行,并指定最大并发限制。队列应按照任务添加顺序(先进先出,FIFO)执行任务,并确保同时运行的任务数量不超过指定数量。如果某个任务的 Promise 被拒绝,则应静默忽略该拒绝,允许队列继续处理剩余任务。
* @Author: oceanhhan
* @Date: 2025-12-16 21:34:10
*/
class AsyncTaskQueue {
private concurrency: number;
private runningCount: number = 0;
private taskQueue: Array<() => Promise<any>> = [];
constructor(concurrency: number) {
// Initialize the queue with the specified concurrency limit
this.concurrency = concurrency;
}
queue(task: () => Promise<any>): void {
// Add an async task to the queue
this.taskQueue.push(task);
this.runNext();
}
private runNext(): void {
// Run the next task in the queue if concurrency limit allows
while (this.runningCount < this.concurrency && this.taskQueue.length > 0) {
const task = this.taskQueue.shift()!;
this.runningCount++;
task()
.then((res) => {
// Task completed successfully
console.log(res);
})
.catch((err) => {
// Silently ignore rejected promises
console.error(err);
})
.finally(() => {
this.runningCount--;
this.runNext();
});
}
}
}
// Example usage:
const taskQueue = new AsyncTaskQueue(2);
const task1 = () =>
new Promise((resolve) => setTimeout(() => resolve("Task 1 done"), 1000));
const task2 = () =>
new Promise((resolve, reject) =>
setTimeout(() => reject("Task 2 failed"), 500),
);
const task3 = () =>
new Promise((resolve) => setTimeout(() => resolve("Task 3 done"), 200));
const task4 = () =>
new Promise((resolve) => setTimeout(() => resolve("Task 4 done"), 300));
const task5 = () =>
new Promise((resolve, reject) =>
setTimeout(() => reject("Task 5 failed"), 400),
);
const task6 = () =>
new Promise((resolve) => setTimeout(() => resolve("Task 6 done"), 600));
taskQueue.queue(task1);
taskQueue.queue(task2);
taskQueue.queue(task3);
taskQueue.queue(task4);
taskQueue.queue(task5);
taskQueue.queue(task6);