SOURCE

function limitConcurrency(tasks,limit) {
    return new Promise((resolve,reject)=>{
        const results = [];
        let runningCount = 0;
        let currentIndex = 0;

        function runNextTask() {
            if(currentIndex >= tasks.length) {
                if(runningCount === 0) {
                    resolve(results)
                }
                return
            }
            const taskIndex = currentIndex;
            const task = tasks[currentIndex];
            currentIndex++
            runningCount++

            Promise.resolve(task()).then((result)=>{
                results[taskIndex] = result;
            }).catch((error)=> {
                reject(error)
            }).finally(()=>{
                runningCount--;
                runNextTask()
            })
        }
        for(let i =0;i<Math.min(limit,tasks.length);i++) {
            runNextTask();
        }
    })
}

function createTask(name,delay){
    return ()=> new Promise((resolve)=>{
        console.log(`${name} started`);
        setTimeout(() => {
            console.log(`${name} finished`)
            resolve(name)
        }, delay)
    })
}

const tasks = [
    createTask("Task 1",1000),
    createTask("Task 2", 500),
    createTask("Task 3", 300),
    createTask("Task 4", 700),
    createTask("Task 5", 200),

]

limitConcurrency(tasks,2).then((results)=>{
    console.log("All tasks completed");
    console.log("Results:", results)
}).catch((error)=>{
    console.error("Error:", error)
})
console 命令行工具 X clear

                    
>
console