No te pierdas este crédito gratuito de 200 USD (Válido durante 60 días) en DO, lanza tu proyecto ahora

Utiliza este crédito para lanzar tus proyectos ahora en Digital Ocean, válido por 60 días

Índice del contenido

Debounce y Throttle en Javascript

Debounce y Throttle en Javascript

Debounce y throttle son patrones de diseño usados para limitar la ejecución de funciones, generalmente son utilizados para restringir la cantidad de veces que un evento se dispara: eventos click, scroll, resize u otros. Los patrones no son exclusivos de Javascript; en una entrada anterior te explique como usar throttle para limitar la cantidad de requests que recibe el servidor nginx.

Ambos patrones generan una función que recibe un callback y un tiempo de espera o delay.

Debounce vs Throttle diferencias principales

Si tienes prisa, estas son las principales diferencias y aplicaciones de ambos patrones. Sin embargo, si quieres entenderlos en profundidad sigue leyendo.

Aspect Debounce Throttle
Definición Ejecuta la función después de un retardo especificado desde la última vez que se disparó el evento. Ejecuta la función a intervalos regulares, asegurando que no sea llamada más de una vez por período.
Tiempo de ejecución Se retrasa hasta que el evento deja de dispararse durante un periodo determinado. Se ejecuta inmediatamente o a intervalos fijos, independientemente de la frecuencia con la que se produzca el evento.
Ejemplo de Caso de Uso Inputs donde se introducen datos: actualización de sugerencias sólo después de que el usuario deje de escribir por un momento. Eventos de scroll: limitar la velocidad a la que se calcula la posición del scroll.

Patrón Debounce

El patrón de rebote o debounce pospone la ejecución de una función hasta que transcurra un determinado tiempo de espera.

Nuevos intentos de ejecutar la función cancelarán la ejecución pendiente y reiniciarán el tiempo de espera.

Esquema simplificado del patrón debounce

Explicación del patrón debounce

El código para debounce en javascript se ve así:

const debounce = (callback, tiempoDeEspera) => {
  let timeout 
  return (...args) => {
	clearTimeout(timeout)
	timeout = setTimeout(()=> callback(...args), tiempoDeEspera)
  }
}

Nuestra función debounce retorna a su vez una función, la cual recibirá cualquier número de argumentos (…args).

Esta función usa un closure para acceder a la variable timeout. ¿Qué es timeout? timeout es una función setTimeout, que programa la ejecución de nuestro callback para su posterior ejecución.

Pero ahora presta atención al clearTimeout. Cada vez que llamemos a la función debounce se eliminará cualquier función programada, por lo que la única manera de que se ejecute nuestro callback es esperar el tiempo que le pasamos como argumento.

Patrón Throttling

El patrón throttling (o aceleración) establece un tiempo de espera durante el cual no se pueden llamar nuevamente más funciones. A diferencia del patrón bounce, el tiempo de espera no se reinicia si intentamos llamar nuevamente a la función.

Esquema simplificado del patrón throttling

Explicación del patrón throttling

El código para el patrón throttling en javascript se ve así.

const throttling = (callback, delay) => {
  let timeout
  return (...args) => {
    if (timeout !== undefined) {
      return
    }

    timeout = setTimeout(() => {
      timeout = undefined
    }, delay)

    return callback(...args)
  }
}

La función throttling retorna una función que tendrá dos vertientes que dependen del estado de timeout:

  • timeout está definido: esto significa que ya hay programada una función para su ejecución, en este caso la función no hace nada, es decir, bloquea la ejecución de nuevas funciones por medio de un return vacio.
  • timeout no está definido: si timeout no está definido, creamos un setTimeout y la asignamos a la variable timeout. Esta función, una vez transcurrido su tiempo de ejecución, se eliminará a si misma de la variable timeout. Posteriormente, y para finalizar, ejecutamos la función callback.

Otros recursos sobre debounce y throttling

Eduardo Zepeda
Desarrollador web, entusiasta de los sistemas GNU/Linux y el Software Libre. Py, Ts y Go, pero abierto a otras opciones como el Rustaceanismo. Creo en las bondades de las criptodivisas más allá de la especulación monetaria.
Leer más