DEV Community

Cover image for When to Debounce vs Throttle: A Developer’s Guide to Efficient Event Handling
Muhammad Usman
Muhammad Usman

Posted on • Originally published at pixicstudio.Medium

2 1 1 1 1

When to Debounce vs Throttle: A Developer’s Guide to Efficient Event Handling

How to use debounce and throttling in JavaScript as well as comparing the differences between them.

Debouncing and throttling are great ways to not only improve your user experience but also save yourself quite a bit of money. In this compression of debounce vs throttle, I’m going to guide you how to use debounce and throttling in JavaScript as well as comparing the differences between them.

Welcome back, my job is to simplify the web for you so you can start building your dream project sooner.

In today’s guide, I’m going to be writing about debounce vs throttle and why they’re important to understand.


Default Behavior

To get started, I have a basic index.html file with:

<div class="container">
<input type="text" placeholder="Type something…">
</div>
<! - Display sections →
<div class="container">
<div class="box">
<h2>Default</h2>
<p id="default-text"></p>
</div>
<div class="box">
<h2>Debounce</h2>
<p id="debounce-text"></p>
</div>
<div class="box">
<h2>Throttle</h2>
<p id="throttle-text"></p>
</div>
</div>
Enter fullscreen mode Exit fullscreen mode
  • A text input.
  • A “Default” section to display text as you type.
  • A “Debounce” section.
  • A “Throttle” section.

Code Setup

// Selecting elements
 const input = document.querySelector('input');
 const defaultText = document.getElementById('default');
 const debounceText = document.getElementById('debounce');
 const throttleText = document.getElementById('throttle');
// Default input listener
 input.addEventListener('input', (e) => {
 defaultText.textContent = e.target.value;
 });
Enter fullscreen mode Exit fullscreen mode

When you type, the defaultText updates instantly. But if this input triggered API calls (like autocomplete), typing “matrix” would send 6 requests — wasting resources and slowing down the app.


Debouncing

How Debounce Works:

  • Waits for a delay (e.g., 1 second) after the last input before triggering.
  • Resets the timer on every new input.

Debounce Implementation

function debounce(callback, delay = 1000) {
 let timeout;
 return (args) => {
 clearTimeout(timeout);
 timeout = setTimeout(() => {
 callback(args);
 }, delay);
 };
 }
// Usage
 const updateDebounceText = debounce((text) => {
 debounceText.textContent = text;
 });
input.addEventListener('input', (e) => {
 updateDebounceText(e.target.value);
 });
Enter fullscreen mode Exit fullscreen mode

Result: If you type quickly, debounceText updates only after a 1-second pause.


Throttling

How Throttle Works:

  • Triggers immediately on the first call.
  • Ignores subsequent calls until the delay (e.g., 1 second) passes.

Basic Throttle Implementation (Flawed)

function throttle(callback, delay = 1000) {
 let shouldWait = false;
 return (args) => {
 if (shouldWait) return;
 callback(args);
 shouldWait = true;
 setTimeout(() => {
 shouldWait = false;
 }, delay);
 };
 }
Enter fullscreen mode Exit fullscreen mode

Problem: If you type “asdf” quickly, throttleText only updates with “a” and ignores “sdf”.

Improved Throttle (Saves Last Call)

function throttle(callback, delay = 1000) {
 let shouldWait = false;
 let waitingArgs = null;
const timeoutFunc = () => {
 if (waitingArgs === null) {
 shouldWait = false;
 } else {
 callback(waitingArgs);
 waitingArgs = null;
 setTimeout(timeoutFunc, delay);
 }
 };
return (args) => {
 if (shouldWait) {
 waitingArgs = args;
 return;
 }
 callback(args);
 shouldWait = true;
 setTimeout(timeoutFunc, delay);
 };
 }
// Usage
 const updateThrottleText = throttle((text) => {
 throttleText.textContent = text;
 });
input.addEventListener('input', (e) => {
 updateThrottleText(e.target.value);
 });
Enter fullscreen mode Exit fullscreen mode

Result: throttleText updates immediately on the first input, then every 1 second with the latest value.


Real-World Use Cases

Mouse Movement Example

let defaultCount = 0, debounceCount = 0, throttleCount = 0;
document.addEventListener('mousemove', () => {
 defaultCount++;
 defaultText.textContent = defaultCount;
 updateDebounceText(++debounceCount);
 updateThrottleText(++throttleCount);
 });
Enter fullscreen mode Exit fullscreen mode

Results:

  • Default: 350+ calls instantly.
  • Debounce: Updates after a 1-second pause.
  • Throttle (100ms delay): Updates 10 times per second.

Best Use Cases:

Feature Best For
Debounce Autocomplete, search bars (wait for user to finish typing)
Throttle Resizing, scrolling, mouse movement (limit frequent updates)

Thanks for reading to the end, and have a good day! 🚀

Let’s grow, learn, and build amazing things together!

Don’t forget to like, save it to your list, and follow me.

Stay connected with me on my other platforms:

LinkedIn | Medium | Bluesky

SurveyJS custom survey software

Simplify data collection in your JS app with a fully integrated form management platform. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more. Integrates with any backend system, giving you full control over your data and no user limits.

Learn more

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more