A small JavaScript throttle & debounce implementation.
Перейти к файлу
Grace Park 688eb7d508
Merge pull request #25 from github/gracepark-actions-maintenance
Upgrade node to 22 and add provenance
2024-10-24 08:19:56 -07:00
.github/workflows update read permissions 2024-10-23 16:14:17 +00:00
decorators feat: add support for TypeScript decorators 2020-03-24 13:06:51 +00:00
test fix: reset `innerStart` variable if passed time is greater than `wait` ms 2023-02-17 09:58:22 +08:00
.flowconfig feat: initial implementation 2019-05-22 09:44:05 +01:00
.gitignore feat: initial implementation 2019-05-22 09:44:05 +01:00
CODEOWNERS Update CODEOWNERS 2023-02-21 17:46:37 +00:00
LICENSE Create LICENSE 2019-05-22 20:00:18 +01:00
README.md feat: add support for TypeScript decorators 2020-03-24 13:06:51 +00:00
decorators.ts refactor: fixup TS types 2021-02-23 15:46:11 +00:00
index.js.flow feat: initial implementation 2019-05-22 09:44:05 +01:00
index.ts fix: reset `innerStart` variable if passed time is greater than `wait` ms 2023-02-17 09:58:22 +08:00
package-lock.json chore(deps-dev): bump braces from 3.0.2 to 3.0.3 2024-06-16 09:50:12 +00:00
package.json npm audit fix 2023-08-25 20:45:51 +00:00
tsconfig.json build: change compiler target to lowest possible version 2020-03-24 16:58:44 +00:00

README.md

mini-throttle

This is a package which provides throttle and debounce functions, with both flow and TypeScript declarations, and a minimal code footprint (less than 60 lines, less than 350 bytes minified+gzipped)

throttling, debouncing, and everything inbetween

type ThrottleOptions = {
  start?: boolean, // fire immediately on the first call
  middle?: boolean, // if true, fire as soon as `wait` has passed
  once?: boolean, // cancel after the first successful call
}
function throttle<T>(
  callback: (...args: T[]) => any,
  wait: number,
  opts?: ThrottleOptions
): (...args: T[]) => void

function debounce<T>(
  callback: (...args: T[]) => any,
  wait: number,
  opts?: ThrottleOptions
): (...args: T[]) => void

This package comes with two functions; throttle and debounce.

Both of these functions offer the exact same signature, because they're both the same function - just with different opts defaults:

  • throttle opts default to { start: true, middle: true, once: false }.
  • debounce opts default to { start: false, middle: false, once: false }.

Each of the options changes when callback gets called. The best way to illustrate this is with a marble diagram.

for (let i = 1; i <= 10; ++i) {
  fn(i)
  await delay(50)
}
await delay(100)
| fn()                                         | 1 2 3 4 5 6 7 8 9 10 |
| throttle(fn, 100)                            | 1 2   4   6   8   10 |
| throttle(fn, 100, {start: false})            |   2   4   6   8   10 |
| throttle(fn, 100, {middle: false})           | 1                 10 |
| throttle(fn, 100, {once: true})              | 1                    |
| throttle(fn, 100, {once: true, start: false})|   2                  |
| debounce(fn, 100)                            |                   10 |

TypeScript Decorators Support!

This package also includes a decorator module which can be used to provide TypeScript Decorator annotations to functions.

Here's an example, showing what you need to do:

import {throttle} from '@github/mini-throttle/decorators'
//                                           ^ note: add `/decorators` to the import to get decorators

class MyClass {
  @throttle(100, { start: false }) // <- Just like normal throttle, but you omit the callback argument
  doThings() {
    // `MyClass.prototype.doThings` will be throttled!
  }
}