Escritos

¿Cuál es la diferencia entre debounce y throttle?

Escribir "istanbul" en un buscador envía 8 solicitudes al servidor. Con 10.000 usuarios, son 80.000 solicitudes. Con debounce se reducen a 1 y con throttle a 4, pero no son lo mismo, y usar la correcta importa.

Furkan Özay15 de septiembre de 2026 · 2 min de lectura
czCZAY.DEV // EDITORIALES
JAVASCRIPT CORE

#JavaScript · 2 MIN DE LECTURA

FURKAN ÖZAYVOL. 2026 // #6450
JS

Escribes "istanbul" en un buscador. Ocho letras, ocho eventos keyup distintos y ocho solicitudes a la API disparadas. El usuario buscó una sola vez, pero tú consultaste al servidor ocho veces.

La factura

Multiplícalo por diez mil usuarios: ochenta mil solicitudes. Seis de cada siete se tiran a la basura antes incluso de que llegue la respuesta, porque el usuario siguió escribiendo.

Debounce: esperar al último evento

Debounce reinicia el temporizador cada vez que se dispara. Si no llega un nuevo evento dentro del tiempo indicado (por ejemplo, 300 ms), envía la última solicitud una sola vez.

JavaScript
function debounce(fn, delay = 300) {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), delay);
  };
}
 
const search = debounce((query) => fetch(`/api/search?q=${query}`));

Ocho pulsaciones de tecla se reducen a una sola solicitud cuando el usuario deja de escribir.

Throttle: emitir a intervalos regulares

Throttle no espera. Permite ejecutar como máximo una vez dentro del intervalo indicado (por ejemplo, 300 ms) y descarta los eventos que lleguen entre medias.

JavaScript
function throttle(fn, interval = 300) {
  let last = 0;
  return (...args) => {
    const now = Date.now();
    if (now - last >= interval) {
      last = now;
      fn(...args);
    }
  };
}

Debounce se fija en el último evento; throttle se fija en el intervalo regular.

Laboratorio interactivo

Escribe y compara en vivo: Raw vs. Throttle vs. Debounce

Escribe rápido en el cuadro de abajo (p. ej. "estambul"). Observa en tiempo real cuántas peticiones al servidor lanza cada estrategia.

Raw (cada tecla)0 peticiones
Aún no se ha disparado ningún evento
Throttle (300 ms)0 peticiones
Aún no se ha disparado ningún evento
Debounce (300 ms)0 peticiones
Aún no se ha disparado ningún evento

Cuál usar y dónde

Una regla sencilla para no confundirlos: si puedes esperar al resultado final, usa debounce: campos de búsqueda, validación de formularios, autoguardado. Si necesitas reducir un flujo continuo de eventos, usa throttle: listeners de scroll, redimensionado de ventana, movimiento del ratón.

Consejo: Extra: cancela la solicitud anterior

Si usas React, combina debounce con AbortController; aborta la solicitud anterior cada vez que lances una nueva. Así, incluso con una red lenta, una respuesta obsoleta no sobrescribirá tu consulta más reciente.

Para terminar

No necesitas una librería para ninguno de los dos; una función de ocho líneas hace el trabajo. Lo importante es saber cuál corresponde a cada caso.

Hoja de ruta y herramienta interactivas

Sigue leyendo