需求
- 任务可以是同步任务也可以是异步任务
- 同时执行的任务上限有限制
实现
class Scheduler {
private maxCount = Infinity;
private runningCount = 0;
private taskQueue: Array<() => Promise<any>> = [];
constructor(count: number) {
this.maxCount = count;
}
addTask(task: () => any) {
const wrappedTask: () => Promise<true> = () =>
new Promise((resolve) => {
const res = task();
if (res?.then) {
res.then(resolve);
} else {
resolve(res);
}
});
this.taskQueue.push(wrappedTask);
}
startTask() {
const count = Math.min(
this.maxCount - this.runningCount,
this.taskQueue.length
);
for (let i = 0; i < count; i++) {
this.request();
}
}
request() {
const task = this.taskQueue.shift();
if (task) {
this.runningCount++;
task().then(() => {
this.runningCount--;
this.startTask();
});
}
}
}