From abba3abcecd17755227290ecfa2aa1dda4d44667 Mon Sep 17 00:00:00 2001 From: Bodo Graumann Date: Thu, 12 May 2022 13:38:36 +0200 Subject: [PATCH 1/2] chore: remove duplicate test --- packages/shared/utils/index.test.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/shared/utils/index.test.ts b/packages/shared/utils/index.test.ts index 33d4169f453..5007716549e 100644 --- a/packages/shared/utils/index.test.ts +++ b/packages/shared/utils/index.test.ts @@ -72,20 +72,6 @@ describe('filters', () => { expect(debouncedFilterSpy).toHaveBeenCalledTimes(2) }) - it('should throttle', () => { - const debouncedFilterSpy = vitest.fn() - const filter = createFilterWrapper(throttleFilter(1000), debouncedFilterSpy) - - setTimeout(filter, 500) - setTimeout(filter, 500) - setTimeout(filter, 500) - setTimeout(filter, 500) - - vitest.runAllTimers() - - expect(debouncedFilterSpy).toHaveBeenCalledTimes(2) - }) - it('should throttle with ref', () => { const debouncedFilterSpy = vitest.fn() const throttle = ref(0) From b7a52ad11914039ec9202f6813c585d4591be46f Mon Sep 17 00:00:00 2001 From: Bodo Graumann Date: Thu, 12 May 2022 14:32:04 +0200 Subject: [PATCH 2/2] fix(throttleFilter): only invoke once when leading is also trailing edge --- .../core/useThrottledRefHistory/index.test.ts | 4 ++-- packages/shared/utils/filters.ts | 17 ++++++++--------- packages/shared/utils/index.test.ts | 11 +++++++++++ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/core/useThrottledRefHistory/index.test.ts b/packages/core/useThrottledRefHistory/index.test.ts index 2a843ed7dfc..5a9f7facae2 100644 --- a/packages/core/useThrottledRefHistory/index.test.ts +++ b/packages/core/useThrottledRefHistory/index.test.ts @@ -16,7 +16,7 @@ describe('useThrottledRefHistory - sync', () => { await promiseTimeout(ms * 3) - expect(history.value.length).toBe(3) + expect(history.value.length).toBe(2) expect(history.value[0].snapshot).toBe(100) v.value = 200 @@ -25,7 +25,7 @@ describe('useThrottledRefHistory - sync', () => { await promiseTimeout(ms * 3) - expect(history.value.length).toBe(5) + expect(history.value.length).toBe(3) expect(history.value[0].snapshot).toBe(400) }) }) diff --git a/packages/shared/utils/filters.ts b/packages/shared/utils/filters.ts index 46795f51f21..bc55d12d5f2 100644 --- a/packages/shared/utils/filters.ts +++ b/packages/shared/utils/filters.ts @@ -103,7 +103,7 @@ export function debounceFilter(ms: MaybeRef, options: DebounceFilterOpti export function throttleFilter(ms: MaybeRef, trailing = true, leading = true) { let lastExec = 0 let timer: ReturnType | undefined - let preventLeading = !leading + let isLeading = true const clear = () => { if (timer) { @@ -123,24 +123,23 @@ export function throttleFilter(ms: MaybeRef, trailing = true, leading = return invoke() } - if (elapsed > duration) { + if (elapsed > duration && (leading || !isLeading)) { lastExec = Date.now() - if (preventLeading) - preventLeading = false - else invoke() + invoke() } - if (trailing) { + else if (trailing) { timer = setTimeout(() => { lastExec = Date.now() - if (!leading) - preventLeading = true + isLeading = true clear() invoke() }, duration) } if (!leading && !timer) - timer = setTimeout(() => preventLeading = true, duration) + timer = setTimeout(() => isLeading = true, duration) + + isLeading = false } return filter diff --git a/packages/shared/utils/index.test.ts b/packages/shared/utils/index.test.ts index 5007716549e..d8725599ec0 100644 --- a/packages/shared/utils/index.test.ts +++ b/packages/shared/utils/index.test.ts @@ -88,4 +88,15 @@ describe('filters', () => { expect(debouncedFilterSpy).toHaveBeenCalledTimes(2) }) + + it('should not duplicate single event', () => { + const debouncedFilterSpy = vitest.fn() + const filter = createFilterWrapper(throttleFilter(1000), debouncedFilterSpy) + + setTimeout(filter, 500) + + vitest.runAllTimers() + + expect(debouncedFilterSpy).toHaveBeenCalledTimes(1) + }) })