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) // 10000ms后输出 任务1执行完成
addTask(5000, 2) // 5000ms后输出 任务2执行完成
addTask(3000, 3) // 8000ms后输出 任务3执行完成
addTask(4000, 4) // 12000ms后输出 任务4执行完成
addTask(5000, 5) // 15000ms后输出 任务5执行完成
setTimeout(() => {
addTask(5000, 6)
}, 16000)
console