Back to Code Bytes
2 min read
debounce()

Description

The debounce fn returns a new function that postpones its execution until after delay milliseconds have passed since the last time it was invoked. This is useful for optimizing performance by limiting how frequently a high-rate event handler (e.g. resize, scroll, input) actually runs.

Code Byte

export function debounce<T extends (...args: any[]) => void>(
  func: T,
  delay: number = 300
): (...args: Parameters<T>) => void {
  let timeoutId: ReturnType<typeof setTimeout>;

  return function(this: any, ...args: Parameters<T>) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

Use cases

  • Search inputs: Wait until the user stops typing before triggering an API call.
  • Window events: Throttle resize or scroll handlers to run at most once per delay period.
  • Auto-save: Save form data only after the user pauses typing.
  • Button clicks: Prevent double-submits by debouncing rapid click events.

Example Usage:

import { debounce } from './debounce.util';

// 1) Debounced resize handler
const onResize = debounce(() => {
  console.log('Window width:', window.innerWidth);
}, 500);

window.addEventListener('resize', onResize);

// 2) Debounced search input
const input = document.getElementById('search') as HTMLInputElement;
input.addEventListener(
  'input',
  debounce((event: Event) => {
    const query = (event.target as HTMLInputElement).value;
    fetch(`/api/search?q=${encodeURIComponent(query)}`)
      .then(res => res.json())
      .then(data => console.log(data));
  }, 300)
);