@dvcol/common-utils
Version:
Typescript library for common utility functions and constants
82 lines (80 loc) • 1.64 kB
JavaScript
// lib/common/utils/debounce.utils.ts
function debounce(func, delay = 250, timout = { value: void 0 }, cancel) {
const timeoutId = timout;
let resolve;
let reject;
let promise;
const previous = [];
const clear = () => {
if (timeoutId.value === void 0) return;
clearTimeout(timeoutId.value);
const result = cancel?.(...previous);
timeoutId.value = void 0;
previous.length = 0;
return result;
};
const finish = () => {
timeoutId.value = void 0;
previous.length = 0;
promise = void 0;
};
const fn = async (...args) => {
if (!promise) ({ resolve, reject, promise } = Promise.withResolvers());
clear();
previous.push(...args);
timeoutId.value = setTimeout(async () => {
try {
const result = await func(...args);
resolve(result);
} catch (error) {
reject(error);
} finally {
finish();
}
}, delay);
return promise;
};
Object.defineProperties(fn, {
cancel: {
value: clear
},
timeout: {
get: () => timeoutId.value
},
resolve: {
value: (value) => {
resolve(value);
finish();
}
},
reject: {
value: (error) => {
reject(error);
finish();
}
},
previous: {
get: () => previous
},
promise: {
get: () => promise
}
});
return fn;
}
function useDebounce({
fn,
cancel,
delay = 250,
timeout = { value: void 0 }
}) {
const debounced = debounce(fn, delay, timeout, cancel);
return {
debounce: debounced,
cancel: debounced.cancel
};
}
export {
debounce,
useDebounce
};