From 5d26c15dafc025b458971a1c3c29494aa62e5a63 Mon Sep 17 00:00:00 2001 From: David Luzar Date: Fri, 26 Mar 2021 17:12:32 +0100 Subject: [PATCH] fix: debounce.flush invokes func even if never queued before (#3326) * fix: `debounce.flush` invokes func even if never queued before * reset after debounced invocation * account for fn throwing --- src/utils.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 22f86dc64..11959d5cf 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -123,17 +123,25 @@ export const debounce = ( timeout: number, ) => { let handle = 0; - let lastArgs: T; + let lastArgs: T | null = null; const ret = (...args: T) => { lastArgs = args; clearTimeout(handle); - handle = window.setTimeout(() => fn(...args), timeout); + handle = window.setTimeout(() => { + lastArgs = null; + fn(...args); + }, timeout); }; ret.flush = () => { clearTimeout(handle); - fn(...(lastArgs || [])); + if (lastArgs) { + const _lastArgs = lastArgs; + lastArgs = null; + fn(..._lastArgs); + } }; ret.cancel = () => { + lastArgs = null; clearTimeout(handle); }; return ret;