function timeout(time) {
return new Promise(resolve => {
setTimeout(() => {
resolve()
}, time)
})
}
class SuperTask {
constructor(maxRunningCount = 2) {
this.taskList = []
this.maxRunningCount = maxRunningCount
this.runningCount = 0
}
add(fn) {
return new Promise((resolve, reject) => {
this.taskList.push({
fn,
reject,
resolve
})
this.run()
})
}
run() {
while(this.runningCount < this.maxRunningCount && this.taskList.length) {
const {fn, resolve, reject} = this.taskList.shift()
this.runningCount++
fn().then(resolve, reject).finally(() => {
this.runningCount--
this.run()
})
}
}
}
const superTask = new SuperTask()
function addTask(time, name) {
superTask.add(() => timeout(time)).then(() => {
console.log(`任务${name}执行完成`)
})
}
addTask(10000, 1)
addTask(5000, 2)
addTask(3000, 3)
addTask(4000, 4)
addTask(5000, 5)
setTimeout(() => {
addTask(5000, 6)
}, 16000)
console