瀏覽代碼

Fix debounce function to always return a viable promise.

Afshin T. Darian 6 年之前
父節點
當前提交
4090d91d65
共有 1 個文件被更改,包括 8 次插入4 次删除
  1. 8 4
      packages/coreutils/src/debounce.ts

+ 8 - 4
packages/coreutils/src/debounce.ts

@@ -15,12 +15,16 @@ export function debounce<T>(
   fn: () => T | Promise<T>,
   interval = 500
 ): () => Promise<T> {
-  let debouncer = 0;
+  let delegate: PromiseDelegate<T> | null = null;
+
   return () => {
-    const delegate = new PromiseDelegate<T>();
-    clearTimeout(debouncer);
-    debouncer = setTimeout(async () => {
+    if (delegate) {
+      return delegate.promise;
+    }
+    delegate = new PromiseDelegate<T>();
+    setTimeout(async () => {
       delegate.resolve(await fn());
+      delegate = null;
     }, interval);
     return delegate.promise;
   };