function Scheduler(limit) {
this.stack = []
this.count = 0
this.limit = limit
}
Scheduler.prototype.add = function(time, fn) {
const task = () => {
return new Promise((resolve, reject)=> {
setTimeout(() => {
fn()
resolve()
}, time)
})
}
this.stack.push(task)
}
Scheduler.prototype.taskStart = function() {
for(let i = 0; i < this.limit; i++) {
this.request()
}
}
Scheduler.prototype.request = function() {
if(!this.stack.length || this.count >= this.limit) {
return;
}
this.count++
let task = this.stack.shift()
task().then((res) => {
this.count--
this.request()
})
}
let addTask = new Scheduler(2)
addTask.add(1000,() => { console.log('1') });
addTask.add(500,() => { console.log('2') });
addTask.add(300,() => { console.log('3') });
addTask.add(400,() => { console.log('4') });
addTask.taskStart()