每次执行完后拉取一个任务
class Queue {
constructor() {
this._queue = [];
}
push(value) {
return this._queue.push(value);
}
shift() {
return this._queue.shift();
}
isEmpty() {
return this._queue.length === 0;
}
}
class DelayedTask {
constructor(resolve, fn, args) {
this.resolve = resolve;
this.fn = fn;
this.args = args;
}
}
class TaskPool {
constructor(size) {
this.size = size;
this.queue = new Queue();
}
addTask(fn, args) {
return new Promise((resolve) => {
this.queue.push(new DelayedTask(resolve, fn, args));
if (this.size) {
this.size--;
const { resolve: taskResole, fn, args } = this.queue.shift();
taskResole(this.runTask(fn, args));
}
})
}
pullTask() {
if (this.queue.isEmpty()) {
return;
}
if (this.size === 0) {
return;
}
this.size++;
const { resolve, fn, args } = this.queue.shift();
resolve(this.runTask(fn, args));
}
runTask(fn, args) {
const result = fn(...args)
result.then(() => {
this.size--;
this.pullTask();
})
return result;
}
}
const taskList = [1000, 3000, 200, 1300, 800, 2000];
const task = timeout => new Promise((resolve) => setTimeout(() => {
resolve(timeout);
console.log(timeout)
}, timeout))
const cc = new TaskPool(2);
async function startConcurrentControl() {
taskList.map(item => cc.addTask(task, [item]))
}
startConcurrentControl();