xtutils
Version:
Thuku's assorted general purpose typescript/javascript library.
60 lines • 2.17 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports._debouced = void 0;
/**
* Create debounced callback function
*
* @param handler Throttled callback handler
* @param delay Callback delay milliseconds
* @param maxWait Maximum callback delay milliseconds
* @param immediate Execute callback before delay
* @returns Throttled callback function
*/
const _debouced = (handler, delay = 200, maxWait = 0, immediate = false) => {
delay = !isNaN(delay = parseFloat(delay)) && delay >= 0 ? delay : 200;
maxWait = !isNaN(maxWait = parseFloat(maxWait)) && maxWait >= 0 && maxWait > delay ? maxWait : 0;
immediate = !!immediate;
let immediateTimer, callTimer, waitTimer, nextCall;
const execute = (is_immediate) => {
let next = nextCall;
nextCall = undefined;
if (waitTimer) {
clearTimeout(waitTimer);
waitTimer = undefined;
}
if (callTimer && !is_immediate) {
clearTimeout(callTimer);
callTimer = undefined;
}
if (next?.length && 'function' === typeof handler)
handler.apply(...next);
if (delay && immediate && !is_immediate) {
immediateTimer = setTimeout(() => {
clearTimeout(immediateTimer);
immediateTimer = undefined;
}, delay);
}
};
const wrapper = function (...args) {
nextCall = [this, args];
if (!delay)
return execute();
const _next = (no_wait = 0) => {
clearTimeout(callTimer);
callTimer = setTimeout(() => execute(), delay);
if (!no_wait && maxWait && !waitTimer)
waitTimer = setTimeout(() => execute(), maxWait);
};
if (!(immediate && !immediateTimer && !callTimer))
return _next();
_next(1);
execute(1);
};
Object.defineProperties(wrapper, {
length: { value: handler.length },
name: { value: `${handler.name || 'anonymous'}__debounced__${delay}` },
});
return wrapper;
};
exports._debouced = _debouced;
//# sourceMappingURL=_debouced.js.map
;