UNPKG

promisedip

Version:

Promise pooler to manage concurrency

2 lines (1 loc) 869 B
class t{constructor({concurrency:t}){const s=t=>{throw new Error("concurrency must be "+t)};Number.isFinite(t)||s("finite"),Number.isInteger(t)||s("an integer"),t<1&&s("greater than 0"),this.t=[],this.i=0,this.h=t,this.o=[]}static async map(s,i,n){const e=new t(n);return Promise.all([...s].map((async(t,s,n)=>e.resolve((async()=>i(t,s,n))))))}async resolve(t){const s=this.u(t);return this.t.push(t),1===this.t.length&&this.m(),s}l(t,s){const i=[];this.o.forEach((n=>{n(t,s)&&i.push(n)})),this.o=this.o.filter((t=>!i.includes(t)))}_(t){this.o.push(t)}async u(t){return new Promise((s=>{this._(((i,n)=>i===t&&(s(n),!0)))}))}async p(){return new Promise((t=>{this._((()=>(t(),!0)))}))}async m(){for(;this.t.length>0;){for(;this.i>=this.h;)await this.p();const t=this.t.shift(),s=t();this.i+=1;const i=()=>{this.l(t,s),this.i-=1};s.then(i,i).catch(i)}}}export default t;