Spaces:
Sleeping
Sleeping
| // @flow | |
| /** | |
| * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests | |
| * are ignored until the function was actually invoked. | |
| * | |
| * @private | |
| */ | |
| class ThrottledInvoker { | |
| _channel: MessageChannel; | |
| _triggered: boolean; | |
| _callback: Function | |
| constructor(callback: Function) { | |
| this._callback = callback; | |
| this._triggered = false; | |
| if (typeof MessageChannel !== 'undefined') { | |
| this._channel = new MessageChannel(); | |
| this._channel.port2.onmessage = () => { | |
| this._triggered = false; | |
| this._callback(); | |
| }; | |
| } | |
| } | |
| trigger() { | |
| if (!this._triggered) { | |
| this._triggered = true; | |
| if (this._channel) { | |
| this._channel.port1.postMessage(true); | |
| } else { | |
| setTimeout(() => { | |
| this._triggered = false; | |
| this._callback(); | |
| }, 0); | |
| } | |
| } | |
| } | |
| remove() { | |
| delete this._channel; | |
| this._callback = () => {}; | |
| } | |
| } | |
| export default ThrottledInvoker; | |