function pLimit(concurrency){ const queue = []; let activeCount = 0; const next = ()=>{ if(queue.length>0 && activeCount<concurrency){ activeCount++ const [task,resolve,reject] = queue.shift(); task().then(resolve).catch(reject).finally(()=>{ activeCount--; next(); }) } } return (fn)=>{ return new Promise((resolve,reject)=>{ queue.push([fn.resolve,reject]); next() }) } }