Throttler.js 1.8 KB

1234567891011121314
  1. export class Throttler{constructor(timeout){this._timeout=timeout;this._isRunningProcess=false;this._asSoonAsPossible=false;this._process=null;this._lastCompleteTime=0;this._schedulePromise=new Promise(fulfill=>{this._scheduleResolve=fulfill;});}
  2. _processCompleted(){this._lastCompleteTime=this._getTime();this._isRunningProcess=false;if(this._process){this._innerSchedule(false);}
  3. this._processCompletedForTests();}
  4. _processCompletedForTests(){}
  5. _onTimeout(){delete this._processTimeout;this._asSoonAsPossible=false;this._isRunningProcess=true;Promise.resolve().then(this._process).catch(console.error.bind(console)).then(this._processCompleted.bind(this)).then(this._scheduleResolve);this._schedulePromise=new Promise(fulfill=>{this._scheduleResolve=fulfill;});this._process=null;}
  6. schedule(process,asSoonAsPossible){this._process=process;const hasScheduledTasks=!!this._processTimeout||this._isRunningProcess;const okToFire=this._getTime()-this._lastCompleteTime>this._timeout;asSoonAsPossible=!!asSoonAsPossible||(!hasScheduledTasks&&okToFire);const forceTimerUpdate=asSoonAsPossible&&!this._asSoonAsPossible;this._asSoonAsPossible=this._asSoonAsPossible||asSoonAsPossible;this._innerSchedule(forceTimerUpdate);return this._schedulePromise;}
  7. _innerSchedule(forceTimerUpdate){if(this._isRunningProcess){return;}
  8. if(this._processTimeout&&!forceTimerUpdate){return;}
  9. if(this._processTimeout){this._clearTimeout(this._processTimeout);}
  10. const timeout=this._asSoonAsPossible?0:this._timeout;this._processTimeout=this._setTimeout(this._onTimeout.bind(this),timeout);}
  11. _clearTimeout(timeoutId){clearTimeout(timeoutId);}
  12. _setTimeout(operation,timeout){return setTimeout(operation,timeout);}
  13. _getTime(){return window.performance.now();}}
  14. self.Common=self.Common||{};Common=Common||{};Common.Throttler=Throttler;Common.Throttler.FinishCallback;