diff --git a/packages/shared/utils/filters.ts b/packages/shared/utils/filters.ts index 9ee57339a7d..4b065f47205 100644 --- a/packages/shared/utils/filters.ts +++ b/packages/shared/utils/filters.ts @@ -134,7 +134,7 @@ export function throttleFilter(ms: MaybeComputedRef, trailing = true, le isLeading = true clear() invoke() - }, duration) + }, duration - elapsed) } if (!leading && !timer) diff --git a/packages/shared/utils/index.test.ts b/packages/shared/utils/index.test.ts index 1303809d9ef..42e4cd138cb 100644 --- a/packages/shared/utils/index.test.ts +++ b/packages/shared/utils/index.test.ts @@ -120,6 +120,23 @@ describe('filters', () => { expect(debouncedFilterSpy).toHaveBeenCalledTimes(2) }) + it('should throttle evenly', () => { + const debouncedFilterSpy = vitest.fn() + + const filter = createFilterWrapper(throttleFilter(1000), debouncedFilterSpy) + + setTimeout(() => filter(1), 500) + setTimeout(() => filter(2), 1000) + setTimeout(() => filter(3), 2000) + + vitest.runAllTimers() + + expect(debouncedFilterSpy).toHaveBeenCalledTimes(3) + expect(debouncedFilterSpy).toHaveBeenCalledWith(1) + expect(debouncedFilterSpy).toHaveBeenCalledWith(2) + expect(debouncedFilterSpy).toHaveBeenCalledWith(3) + }) + it('should throttle with ref', () => { const debouncedFilterSpy = vitest.fn() const throttle = ref(0) diff --git a/packages/shared/watchDebounced/index.test.ts b/packages/shared/watchDebounced/index.test.ts index 5e4bdd5baa2..aa176c02324 100644 --- a/packages/shared/watchDebounced/index.test.ts +++ b/packages/shared/watchDebounced/index.test.ts @@ -39,7 +39,7 @@ describe('watchDebounced', () => { expect(cb).toHaveBeenCalledTimes(1) num.value = 5 - await promiseTimeout(70) + await promiseTimeout(75) expect(cb).toHaveBeenCalledTimes(2) expect(cb).toHaveBeenCalledWith(4, 2, expect.anything()) }) diff --git a/packages/shared/watchThrottled/index.test.ts b/packages/shared/watchThrottled/index.test.ts index 3626fa1bbcd..ab375dd76fb 100644 --- a/packages/shared/watchThrottled/index.test.ts +++ b/packages/shared/watchThrottled/index.test.ts @@ -23,12 +23,12 @@ describe('watchThrottled', () => { num.value = 3 await promiseTimeout(50) - expect(cb).toHaveBeenCalledTimes(1) - expect(cb).toHaveBeenCalledWith(1, 0, expect.anything()) + expect(cb).toHaveBeenCalledTimes(2) + expect(cb).toHaveBeenCalledWith(3, 2, expect.anything()) num.value = 4 await promiseTimeout(100) - expect(cb).toHaveBeenCalledTimes(2) + expect(cb).toHaveBeenCalledTimes(3) expect(cb).toHaveBeenCalledWith(4, 3, expect.anything()) }) })