diff options
Diffstat (limited to 'ui/src/utils.ts')
-rw-r--r-- | ui/src/utils.ts | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/ui/src/utils.ts b/ui/src/utils.ts index d0c7c89a..b9d9a389 100644 --- a/ui/src/utils.ts +++ b/ui/src/utils.ts @@ -117,3 +117,45 @@ export async function getPageTitle(url: string) { return data; } +export function debounce(func: any, wait: number = 500, immediate: boolean = 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: number; + + // Calling debounce returns a new anonymous function + return function() { + // reference the context and args for the setTimeout function + var context = this, + args = arguments; + + // Should the function be called now? If immediate is true + // and not already in a timeout then the answer is: Yes + var callNow = immediate && !timeout; + + // This is the basic debounce behaviour 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); + + // 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(context, args); + } + }, wait); + + // Immediate mode and no wait timer? Execute the function.. + if (callNow) func.apply(context, args); + } +} |