npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

debounce

v4.0.0

Published

Delay function calls until a set time elapses after the last invocation

Readme

debounce

Delay function calls until a set time elapses after the last invocation

Install

npm install debounce

Usage

import debounce from 'debounce';

function resize() {
	console.log('height', window.innerHeight);
	console.log('width', window.innerWidth);
}

const onResize = debounce(resize, 200);
window.addEventListener('resize', onResize);

To check if the debounce delay is currently active:

onResize.isPending;

To later clear the timer and cancel currently scheduled executions:

onResize.clear();

Execute a pending call immediately (and clear the timer). Does nothing when there is no call waiting to run, which leaves any timer as it was:

onResize.flush();

To execute immediately and clear the timer if it was previously set:

onResize.trigger();

API

debounce(fn, wait?, options?)

Creates a debounced function that delays execution until wait milliseconds have passed since its last invocation.

The wait is in milliseconds and defaults to 100.

Set the immediate option to true to execute the function immediately at the start of the wait interval, preventing issues such as double-clicks on a button.

The returned function has the following methods:

  • .isPending indicates whether the debounce delay is currently active.
  • .clear() cancels any scheduled executions.
  • .flush() if a call is waiting to run then it is run immediately and the timer is cleared. Otherwise nothing happens and any timer is left as it was. In immediate mode, the calls made during the wait do not run on their own, but .flush() runs the last of them.
  • .trigger() executes the function immediately and clears the timer if it was previously set. With no call waiting to run it still calls the function, with no arguments and no receiver.

Errors

debounce() throws a TypeError if the first parameter is not a function, or if options is a boolean. It throws a RangeError if wait is negative, NaN, larger than the largest delay a timer can wait for, or a value that does not compare as a number such as a non-numeric string.

Using it in a class

One debounced function shares one timer between all its callers. If you put it on a prototype, all instances share it, so calls from different instances within one wait collapse into one and the others are silently dropped. Give each instance its own debounced function instead:

class Widget {
	onResize = debounce(() => {
		console.log('width', this.width);
	}, 200);
}

Related

  • debounce-fn - Similar but with more options like maxWait and before/after
  • p-debounce - Similar but handles promises
  • throttleit - Throttle a function to limit its execution rate