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