From a11ed7739ece741158d7433bbf46822a35886b0c Mon Sep 17 00:00:00 2001 From: Sv443 Date: Tue, 2 Apr 2024 22:25:51 +0200 Subject: [PATCH] feat: trigger edge param for debounce --- .changeset/grumpy-snakes-care.md | 5 +++++ .github/assets/debounce.png | Bin 0 -> 44536 bytes README-summary.md | 2 +- README.md | 33 +++++++++++++++++++++++++------ lib/misc.ts | 20 +++++++++++++++---- 5 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 .changeset/grumpy-snakes-care.md create mode 100644 .github/assets/debounce.png diff --git a/.changeset/grumpy-snakes-care.md b/.changeset/grumpy-snakes-care.md new file mode 100644 index 0000000..7847663 --- /dev/null +++ b/.changeset/grumpy-snakes-care.md @@ -0,0 +1,5 @@ +--- +"@sv443-network/userutils": minor +--- + +Added parameter to switch `debounce()` to trigger on the rising edge, instead of just the falling edge [(see docs)](https://github.com/Sv443-Network/UserUtils#debounce) diff --git a/.github/assets/debounce.png b/.github/assets/debounce.png new file mode 100644 index 0000000000000000000000000000000000000000..1724b7cbae341f1d2e400bf6e9a6cb8802c812d8 GIT binary patch literal 44536 zcmd42^;6qj&^H`Pffg-Zv@PxwcPF?M2`%O0v z=O1`x-XAi_H@pF?A1v zqh%By+$|E6e?_fjHPB@CQ|CaOh3Moed~4cMu>h3g_;AE{7lT#47|e06O#vpYZE4RMSLKP@70HFF7{&yz9TO`l>@t)`1 z2^~

r$&stou||H1$R%MHAuTFcAm5J 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

=ZUY+p#alb@GQ@t+7(|agK-AiKdOB-X@O)HC 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 I9JdetU+8W>%>V!Z literal 0 HcmV?d00001 diff --git a/README-summary.md b/README-summary.md index 6703981..bd1b9fe 100644 --- a/README-summary.md +++ b/README-summary.md @@ -46,7 +46,7 @@ or view the documentation of previous major releases: - [DataStore](https://github.com/Sv443-Network/UserUtils#DataStore) - class that manages a sync & async persistent JSON database, including data migration - [autoPlural()](https://github.com/Sv443-Network/UserUtils#autoplural) - automatically pluralize a string - [pauseFor()](https://github.com/Sv443-Network/UserUtils#pausefor) - pause the execution of a function for a given amount of time - - [debounce()](https://github.com/Sv443-Network/UserUtils#debounce) - call a function only once, after a given amount of time + - [debounce()](https://github.com/Sv443-Network/UserUtils#debounce) - call a function only once in a series of calls, after or before a given timeout - [fetchAdvanced()](https://github.com/Sv443-Network/UserUtils#fetchadvanced) - wrapper around the fetch API with a timeout option - [insertValues()](https://github.com/Sv443-Network/UserUtils#insertvalues) - insert values into a string at specified placeholders - [compress()](https://github.com/Sv443-Network/UserUtils#compress) - compress a string with Gzip or Deflate diff --git a/README.md b/README.md index 17e3897..ee362a0 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ View the documentation of previous major releases: - [DataStore](#datastore) - class that manages a sync & async persistent JSON database, including data migration - [autoPlural()](#autoplural) - automatically pluralize a string - [pauseFor()](#pausefor) - pause the execution of a function for a given amount of time - - [debounce()](#debounce) - call a function only once, after a given amount of time + - [debounce()](#debounce) - call a function only once in a series of calls, after or before a given timeout - [fetchAdvanced()](#fetchadvanced) - wrapper around the fetch API with a timeout option - [insertValues()](#insertvalues) - insert values into a string at specified placeholders - [compress()](#compress) - compress a string with Gzip or Deflate @@ -1180,22 +1180,43 @@ async function run() { ### debounce() Usage: ```ts -debounce(func: Function, timeout?: number): Function +debounce(func: Function, timeout?: number, edge?: "falling" | "rising"): Function ``` -Debounces a function, meaning that it will only be called once after a given amount of time. -This is very useful for functions that are called repeatedly, like event listeners, to remove extraneous calls. -All passed properties will be passed down to the debounced function. -The timeout will default to 300ms if left undefined. +Returns a debounced wrapper function, meaning that the given `func` will only be called once after or before a given amount of time. +This is very useful for functions that are called repeatedly, like event listeners, to remove a substantial amount of unnecessary calls. +All parameters passed to the returned function will be passed along to the input `func` + +The `timeout` will default to 300ms if left undefined. + +The `edge` ("falling" by default) determines if the function should be called after the timeout has passed or before it. +In simpler terms, this results in "falling" edge functions being called once at the very end of a sequence of calls, and "rising" edge functions being called once at the beginning and possibly multiple times following that, but at the very least they're spaced apart by what's passed in `timeout`. + +This diagram can hopefully help bring the difference across: +

Click to view the diagram + +![debounce function edge diagram](./.github/assets/debounce.png) + +
+ +
Example - click to view ```ts import { debounce } from "@sv443-network/userutils"; +// uses "falling" edge by default: window.addEventListener("resize", debounce((event) => { console.log("Window was resized:", event); }, 500)); // 500ms timeout + +// using "rising" edge: +const myFunc = debounce((event) => { + console.log("Body was scrolled:", event); +}, 100, "rising"); // 100ms timeout + +document.body.addEventListener("scroll", myFunc); ```
diff --git a/lib/misc.ts b/lib/misc.ts index cc4c46e..e92e3c7 100644 --- a/lib/misc.ts +++ b/lib/misc.ts @@ -53,12 +53,24 @@ export function pauseFor(time: number) { /** * Calls the passed {@linkcode func} after the specified {@linkcode timeout} in ms (defaults to 300). * Any subsequent calls to this function will reset the timer and discard all previous calls. + * @param func The function to call after the timeout + * @param timeout The time in ms to wait before calling the function + * @param edge Whether to call the function at the very first call ("rising" edge) or the very last call ("falling" edge, default) */ -export function debounce void, TArgs = any>(func: TFunc, timeout = 300) { // eslint-disable-line @typescript-eslint/no-explicit-any - let timer: number | undefined; +export function debounce void, TArgs = any>(func: TFunc, timeout = 300, edge: "rising" | "falling" = "falling") { // eslint-disable-line @typescript-eslint/no-explicit-any + let timer: NodeJS.Timeout | undefined; + return function(...args: TArgs[]) { - clearTimeout(timer); - timer = setTimeout(() => func.apply(this, args), timeout) as unknown as number; + if(edge === "rising") { + if(!timer) { + func.apply(this, args); + timer = setTimeout(() => timer = undefined, timeout); + } + } + else { + clearTimeout(timer); + timer = setTimeout(() => func.apply(this, args), timeout); + } }; }