async-wrappers
Version:
A set of wrapper functions to perform debouncing, throttling, retrying etc.
61 lines (51 loc) • 1.25 kB
JavaScript
/**
* @internal
*/
/**
* @internal
*/
var deferred = callback => {
var handle = null;
var clear = clearTimeout;
var call = () => {
deferred.called = Date.now();
deferred.delay = -1;
callback();
};
var defer = delay => {
delay = delay < 0 ? 0 : delay;
deferred.deferred = Date.now();
if (delay === 0 && deferred.delay === 0) {
// if a delay is 0 it will happen on next execution.
// so delaying a current delay of 0 should have no effect.
// This is necessary here as a setTimeout implementation could
// keep deferring execution, due to it's resolution issues.
return;
} // clear existing
if (handle !== null) clear(handle);
deferred.delay = delay;
var useTimeout = !setImmediate || delay ? true : false;
clear = useTimeout ? clearTimeout : clearImmediate;
if (useTimeout) {
handle = setTimeout(call, delay || 0);
} else {
handle = setImmediate(call);
}
};
var cancel = () => {
if (handle !== null) {
deferred.delay = -1;
clear(handle);
handle = null;
}
};
var deferred = {
called: 0,
deferred: 0,
delay: -1,
defer,
cancel
};
return deferred;
};
export default deferred;