UNPKG

rate-limitation

Version:
2 lines (1 loc) 1.03 kB
class e{constructor(e){this.promise,this.resolve,this.reject,this.promise=new Promise((e,s)=>{this.resolve=e,this.reject=s}),void 0!==e&&this.resolve(e)}}export default class{constructor(e,s={}){this.limit,this.waitingQueue=[],this.processingQueue=[],this.onQueueEmpty,this.limit=e,this.onQueueEmpty=s.onQueueEmpty}enqueue(s,t,...u){const i={def:new e,func:s.bind(t,...u)};return this.waitingQueue.push(i),this.processingQueue.length<this.limit&&this._processRequest(),i.def.promise}_onDequeue(){this.waitingQueue.length?this._processRequest():this.onQueueEmpty&&this.onQueueEmpty()}_processRequest(){const e=this.waitingQueue.shift();let s;this.processingQueue.push(e);try{s=e.func()}catch(s){e.def.reject(s),this._dequeueRequest(e)}s&&"function"==typeof s.then?s.then(s=>{e.def.resolve(s),this._dequeueRequest(e)}).catch(s=>{e.def.reject(s),this._dequeueRequest(e)}):(e.def.resolve(s),this._dequeueRequest(e))}_dequeueRequest(e){const s=this.processingQueue.findIndex(s=>s===e);this.processingQueue.splice(s,1),this._onDequeue()}}