diff --git a/src/shared/utils/helpers/debounce.ts b/src/shared/utils/helpers/debounce.ts index 7a1e8b19..d5cd7017 100644 --- a/src/shared/utils/helpers/debounce.ts +++ b/src/shared/utils/helpers/debounce.ts @@ -3,42 +3,22 @@ export function debounce( wait = 1000, immediate = false ) { - // 'private' variable for instance - // The returned function will be able to reference this due to closure. - // Each call to the returned function will share this common timer. let timeout: NodeJS.Timeout | null; - // Calling debounce returns a new anonymous function return function () { - // reference the context and args for the setTimeout function const args = arguments; - - // Should the function be called now? If immediate is true - // and not already in a timeout then the answer is: Yes const callNow = immediate && !timeout; - // This is the basic debounce behavior where you can call this - // function several times, but it will only execute once - // [before or after imposing a delay]. - // Each time the returned function is called, the timer starts over. clearTimeout(timeout ?? undefined); - // Set the new timeout timeout = setTimeout(function () { - // Inside the timeout function, clear the timeout variable - // which will let the next execution run when in 'immediate' mode timeout = null; - // Check if the function already ran with the immediate flag if (!immediate) { - // Call the original function with apply - // apply lets you define the 'this' object as well as the arguments - // (both captured before setTimeout) func.apply(this, args); } }, wait); - // Immediate mode and no wait timer? Execute the function.. if (callNow) func.apply(this, args); } as (...e: T) => R; }