UNPKG

@dvcol/common-utils

Version:

Typescript library for common utility functions and constants

82 lines (80 loc) 1.64 kB
// 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 };