2023-03-14
2023-03-13 本文已影响0人
LuckySunSet
题目:
class SuperTask {
add(task) {
}
}
function timeout(time) {
return new Promise(function (resolve) {
setTimeout(()=>resolve(), time);
});
}
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执行完成
答案:
class SuperTask {
constructor(parallelCount = 2) {
this.parallelCount = parallelCount; // 并发数量
this.runnintCount = 0; // 正在运行的任务数量
this.tasks = []; // 任务列表
}
add(task) {
return new Promise((resolve, reject) => {
this.tasks.push({ task, resolve, reject });
this._run();
});
}
_run() {
while (this.parallelCount > this.runnintCount && this.tasks.length >= 1) {
this.runnintCount++;
const {task, resolve, reject } = this.tasks.shift();
task().then(resolve, reject).finally(() => {
this.runnintCount--;
this._run();
})
}
}
}
function timeout(time) {
return new Promise(function (resolve) {
setTimeout(()=>resolve(), time);
});
}
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执行完成