From 803bbfa0fe9dc9a560bae1b282aa688c32ed93fc Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Mon, 26 Aug 2019 20:00:48 +0700 Subject: [PATCH] Add debounce to tasq --- packages/tasq/src/debounce.test.ts | 17 +++++++++++++++++ packages/tasq/src/debounce.ts | 13 +++++++++++++ packages/tasq/src/index.ts | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 packages/tasq/src/debounce.test.ts create mode 100644 packages/tasq/src/debounce.ts diff --git a/packages/tasq/src/debounce.test.ts b/packages/tasq/src/debounce.test.ts new file mode 100644 index 0000000..b95c0d0 --- /dev/null +++ b/packages/tasq/src/debounce.test.ts @@ -0,0 +1,17 @@ +import {debounce} from './debounce' + +describe('debounce', () => { + + it('executes only once', async () => { + const add = jest.fn() + const d = debounce(add, 0) + d(1, 2) + d(3, 4) + d(5, 6) + d(7, 8) + + await new Promise(resolve => setTimeout(resolve, 0)) + expect(add.mock.calls).toEqual([[ 7, 8 ]]) + }) + +}) diff --git a/packages/tasq/src/debounce.ts b/packages/tasq/src/debounce.ts new file mode 100644 index 0000000..e7418dc --- /dev/null +++ b/packages/tasq/src/debounce.ts @@ -0,0 +1,13 @@ +export function debounce(fn: (...args: A[]) => R, delay: number) { + let timeout: NodeJS.Timeout | null = null + + return async function debounceImpl(...args: A[]) { + if (timeout) { + clearTimeout(timeout) + } + + timeout = setTimeout(() => { + fn(...args) + }, delay) + } +} diff --git a/packages/tasq/src/index.ts b/packages/tasq/src/index.ts index 8b13789..3c52094 100644 --- a/packages/tasq/src/index.ts +++ b/packages/tasq/src/index.ts @@ -1 +1 @@ - +export * from './debounce'