When building modern web apps, performance matters. Typing in a search bar, resizing a window, or scrolling a page can trigger hundreds of events per second. If each event runs expensive logic (like an API call), your app slows down.
That’s where Debouncing and Throttling come in — two techniques to control event execution frequency.
⏱ Debouncing
Debouncing ensures a function runs only after a certain amount of time has passed since the last event.
👉 Use Case: Search input (API should trigger only after the user stops typing).
✅ React Example: Debounce with useEffect
import React, { useState, useEffect } from "react";
function SearchBox() {
const [query, setQuery] = useState("");
useEffect(() => {
const handler = setTimeout(() => {
if (query) {
console.log("API call with:", query);
}
}, 500); // wait 500ms after last keystroke
return () => clearTimeout(handler);
}, [query]);
return <input onChange={(e) => setQuery(e.target.value)} />;
}
✅ Angular Example: Debounce with RxJS
import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';
import { debounceTime } from 'rxjs/operators';
@Component({
selector: 'app-search',
template: `<input [formControl]="searchControl" />`
})
export class SearchComponent {
searchControl = new FormControl();
constructor() {
this.searchControl.valueChanges
.pipe(debounceTime(500)) // wait 500ms
.subscribe(value => console.log("API call with:", value));
}
}
⚡ Throttling
Throttling ensures a function runs at most once in a given time interval.
👉 Use Case: Window resize or scroll events.
✅ React Example: Throttle Scroll
import React, { useEffect } from "react";
function ScrollTracker() {
useEffect(() => {
const handleScroll = () => {
console.log("Scroll position:", window.scrollY);
};
const throttled = throttle(handleScroll, 1000);
window.addEventListener("scroll", throttled);
return () => window.removeEventListener("scroll", throttled);
}, []);
const throttle = (fn, limit) => {
let inThrottle;
return function (...args) {
if (!inThrottle) {
fn(...args);
inThrottle = true;
setTimeout(() => (inThrottle = false), limit);
}
};
};
return <h2>Scroll the page!</h2>;
}
✅ Angular Example: Throttle with RxJS
import { Component, HostListener } from '@angular/core';
import { fromEvent } from 'rxjs';
import { throttleTime } from 'rxjs/operators';
@Component({
selector: 'app-scroll-tracker',
template: `<h2>Scroll the page!</h2>`
})
export class ScrollTrackerComponent {
ngOnInit() {
fromEvent(window, 'scroll')
.pipe(throttleTime(1000)) // execute every 1s
.subscribe(() => {
console.log("Scroll position:", window.scrollY);
});
}
}
📊 Debounce vs Throttle
Feature Debounce Throttle
Execution After inactivity At regular intervals
Use Cases Search, autocomplete, resize end Scroll, resize, mouse move
✅ Conclusion
- Use Debouncing when you want to wait until a user stops performing an action.
- Use Throttling when you want to limit how often something executes during continuous actions.
Both techniques are essential for smooth, performant apps in React and Angular.
Top comments (0)