소스 검색

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;
   };