deno.land / std@0.224.0 / async / debounce.ts

debounce.ts
View Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.// This module is browser compatible.
/** * A debounced function that will be delayed by a given `wait` * time in milliseconds. If the method is called again before * the timeout expires, the previous call will be aborted. */export interface DebouncedFunction<T extends Array<unknown>> { (...args: T): void; /** Clears the debounce timeout and omits calling the debounced function. */ clear(): void; /** Clears the debounce timeout and calls the debounced function immediately. */ flush(): void; /** Returns a boolean whether a debounce call is pending or not. */ readonly pending: boolean;}
/** * Creates a debounced function that delays the given `func` * by a given `wait` time in milliseconds. If the method is called * again before the timeout expires, the previous call will be * aborted. * * @example * ```ts * import { debounce } from "https://deno.land/std@$STD_VERSION/async/debounce.ts"; * * await Array.fromAsync( * Deno.watchFs('./'), * debounce((event) => { * console.log('[%s] %s', event.kind, event.paths[0]); * }, 200), * ); * // wait 200ms ... * // output: Function debounced after 200ms with baz * ``` * * @param fn The function to debounce. * @param wait The time in milliseconds to delay the function. */// deno-lint-ignore no-explicit-anyexport function debounce<T extends Array<any>>( fn: (this: DebouncedFunction<T>, ...args: T) => void, wait: number,): DebouncedFunction<T> { let timeout: number | null = null; let flush: (() => void) | null = null;
const debounced: DebouncedFunction<T> = ((...args: T) => { debounced.clear(); flush = () => { debounced.clear(); fn.call(debounced, ...args); }; timeout = setTimeout(flush, wait); }) as DebouncedFunction<T>;
debounced.clear = () => { if (typeof timeout === "number") { clearTimeout(timeout); timeout = null; flush = null; } };
debounced.flush = () => { flush?.(); };
Object.defineProperty(debounced, "pending", { get: () => typeof timeout === "number", });
return debounced;}
std

Version Info

Tagged at
6 months ago