diff --git a/src/modules/esl-utils/async/debounce.ts b/src/modules/esl-utils/async/debounce.ts index ee52e3c54..961a17ff2 100644 --- a/src/modules/esl-utils/async/debounce.ts +++ b/src/modules/esl-utils/async/debounce.ts @@ -3,10 +3,14 @@ import {createDeferred} from './promise/defered'; import type {AnyToAnyFnSignature} from '../misc/functions'; import type {Deferred} from './promise/defered'; +type UnwrapPromise = T extends Promise ? UnwrapPromise : T; + /** Debounced is a function wrapper type for a function decorated via debounce */ export interface Debounced { /** Debounced method signature */ - (...args: Parameters): void; + (...args: Parameters): ReturnType extends Promise + ? Promise>> + : ReturnType | void; /** Promise of deferred function call */ promise: Promise | void>; /** Cancel debounced call */ @@ -27,7 +31,7 @@ export function debounce(fn: F, wait = 10, thisAr let timeout: number | null = null; let deferred: Deferred> | null = null; - function debouncedSubject(...args: any[]): void { + function debouncedSubject(...args: any[]): Promise | void> { deferred = deferred || createDeferred(); (typeof timeout === 'number') && clearTimeout(timeout); timeout = window.setTimeout(() => { @@ -37,7 +41,9 @@ export function debounce(fn: F, wait = 10, thisAr deferred && deferred.resolve(result); deferred = null; }, wait); + return deferred.promise; } + function cancel(): void { (typeof timeout === 'number') && clearTimeout(timeout); timeout = null; diff --git a/src/modules/esl-utils/async/test/debounce.test.ts b/src/modules/esl-utils/async/test/debounce.test.ts index 57c41ef96..ea8b3abfa 100644 --- a/src/modules/esl-utils/async/test/debounce.test.ts +++ b/src/modules/esl-utils/async/test/debounce.test.ts @@ -8,13 +8,12 @@ describe('async/debounce', () => { const fn = jest.fn(); const debounced = debounce(fn, 50); - expect(debounced()).toBeUndefined(); debounced(); jest.advanceTimersByTime(25); - expect(debounced()).toBeUndefined(); expect(fn).toBeCalledTimes(0); jest.advanceTimersByTime(50); expect(fn).toBeCalledTimes(1); + expect(debounced()).resolves.toBeUndefined(); }); test('call context', () => {