
并发控制#
function timeout(timer) {
return new Promise((res) => setTimeout(res, timer));
}
class SuperTask {
constructor(parallelCount = 2) {
this.parallelCount = parallelCount; //并发数
this.tasks = []; //还在排队的任务
this.runningCount = 0; //正在执行的任务数
}
add(task) {
return new Promise((resolve, reject) => {
this.tasks.push({
task,
resolve,
reject,
});
this._run();
});
}
_run() {
while (this.runningCount < this.parallelCount && this.tasks.length) {
const { task, resolve, reject } = this.tasks.shift(); //取出第一个任务
task()
.then(resolve, reject)
.finally(() => {
//不管成功失败都会去再次尝试执行任务
this.runningCount--;
this._run();
});
this.runningCount++;
}
}
}
const superTask = new SuperTask();
function addTask(time, name) {
superTask
.add(() => timeout(time))
.then(() => {
console.log(`任务${name}完成`);
});
}
addTask(10000, 1); //10000ms后输出 任务1完成
addTask(5000, 2); // 5000ms后输出 任务2完成
addTask(3000, 3); // 8000ms后输出 任务3完成
addTask(4000, 4); // 12000ms后输出 任务4完成
addTask(5000, 5); // 15000ms后输出 任务5完成