Kaynağa Gözat

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
David Luzar 4 yıl önce
ebeveyn
işleme
5d26c15daf
1 değiştirilmiş dosya ile 11 ekleme ve 3 silme
  1. 11 3
      src/utils.ts

+ 11 - 3
src/utils.ts

@@ -123,17 +123,25 @@ export const debounce = <T extends any[]>(
   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;