DEV Community

Cover image for Debouncing and Throttling in React and Angular: Code Examples
Mridu Dixit
Mridu Dixit

Posted on

Debouncing and Throttling in React and Angular: Code Examples

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)} />; } 
Enter fullscreen mode Exit fullscreen mode

✅ 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)); } } 
Enter fullscreen mode Exit fullscreen mode

⚡ 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>; } 
Enter fullscreen mode Exit fullscreen mode

✅ 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); }); } } 
Enter fullscreen mode Exit fullscreen mode

📊 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)