Add debounce to tasq
This commit is contained in:
parent
359c6afd08
commit
803bbfa0fe
17
packages/tasq/src/debounce.test.ts
Normal file
17
packages/tasq/src/debounce.test.ts
Normal file
@ -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 ]])
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
13
packages/tasq/src/debounce.ts
Normal file
13
packages/tasq/src/debounce.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export function debounce<A, R>(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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1 +1 @@
|
|||||||
|
export * from './debounce'
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user