You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
# perfect-debounce
<!-- automd:badges color=yellow codecov bundlephobia packagephobia -->
[](https://npmjs.com/package/perfect-debounce)[](https://npm.chart.dev/perfect-debounce)[](https://bundlephobia.com/package/perfect-debounce)[](https://packagephobia.com/result?p=perfect-debounce)[](https://codecov.io/gh/unjs/perfect-debounce)
<!-- /automd -->
Improved debounce function with Promise support.
## Features
- Well tested debounce implementation- Native Promise support- Avoid duplicate calls while promise is being resolved- Configurable `trailing` and `leading` behavior- Control methods
## Usage
Install package:
```shnpx nypm i perfect-debounce```
Import:
```jsimport { debounce } from "perfect-debounce";```
Debounce function:
```jsconst debounced = debounce(async () => { // Some heavy stuff}, 25);```
When calling `debounced`, it will wait at least for `25ms` as configured before actually calling your function. This helps to avoid multiple calls.
### Control Methods
The returned debounced function provides additional control methods:
- `debounced.cancel()`: Cancel any pending invocation that has not yet occurred.- `await debounced.flush()`: Immediately invoke the pending function call (if any) and return its result.- `debounced.isPending()`: Returns `true` if there is a pending invocation waiting to be called, otherwise `false`.
```jsdebounced.cancel(); // Cancel any pending callawait debounced.flush(); // Immediately invoke pending call (if any)debounced.isPending(); // Returns true if a call is pending```
### Example
```jsconst debounced = debounce(async (value) => { // Some async work return value * 2;}, 100);
debounced(1);debounced(2);debounced(3);
// Check if a call is pendingconsole.log(debounced.isPending()); // true
// Immediately invoke the pending callconst result = await debounced.flush();console.log(result); // 6
// Cancel any further pending callsdebounced.cancel();```
To avoid initial wait, we can set `leading: true` option. It will cause function to be immediately called if there is no other call:
```jsconst debounced = debounce( async () => { // Some heavy stuff }, 25, { leading: true },);```
If executing async function takes longer than debounce value, duplicate calls will be still prevented a last call will happen. To disable this behavior, we can set `trailing: false` option:
```jsconst debounced = debounce( async () => { // Some heavy stuff }, 25, { trailing: false },);```
## 💻 Development
- Clone this repository- Enable [Corepack](https://github.com/nodejs/corepack) using `corepack enable` (use `npm i -g corepack` for Node.js < 16.10)- Install dependencies using `pnpm install`- Run interactive tests using `pnpm dev`
## License
Based on [sindresorhus/p-debounce](https://github.com/sindresorhus/p-debounce).
Made with 💛 Published under [MIT License](./LICENSE).
|