SOURCE

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 命令行工具 X clear

                    
>
console