Command Palette

Search for a command to run...

setTimeout y clearTimeout: Ejecución Diferida de Código

Aprende a usar setTimeout para programar ejecución diferida de código y clearTimeout para cancelar timeouts, entiende el event loop y cómo pasar argumentos.

Lectura: 11 min
Nivel: Principiante

TL;DR - Resumen rápido

  • setTimeout() ejecuta código después de un delay especificado en milisegundos
  • clearTimeout() cancela un timeout pendiente
  • setTimeout() retorna un ID que se usa para cancelar el timeout
  • Puedes pasar argumentos adicionales a la función de callback
  • setTimeout() no garantiza ejecución exacta en el tiempo especificado

Introducción a setTimeout y clearTimeout

Los métodos setTimeout() y clearTimeout() te permiten programar la ejecución de código después de un delay específico. setTimeout() ejecuta una función o evalúa una expresión después de un número de milisegundos especificado, mientras que clearTimeout() cancela un timeout que aún no se ha ejecutado. Estos métodos son fundamentales para crear animaciones, retrasos, y operaciones asíncronas en JavaScript.

Es importante entender que setTimeout() no garantiza que el código se ejecute exactamente en el tiempo especificado. El delay es el tiempo mínimo antes de que el código se ejecute, pero el tiempo real puede ser mayor dependiendo de la carga del navegador, el event loop, y otras tareas en la cola de ejecución.

  • setTimeout() - ejecuta código después de un delay especificado
  • clearTimeout() - cancela un timeout pendiente
  • setTimeout() retorna un ID único para identificar el timeout
  • El delay es el tiempo mínimo, no garantizado
  • Útil para animaciones, retrasos y operaciones asíncronas

Event Loop y setTimeout

setTimeout() usa el event loop de JavaScript para programar la ejecución. El código se coloca en la cola de tareas y se ejecuta cuando el event loop está disponible, lo cual puede ser después del tiempo especificado.

Método setTimeout()

El método setTimeout() acepta una función o una string de código a ejecutar, y un delay en milisegundos. También acepta argumentos adicionales que se pasan a la función de callback. El método retorna un ID único que puedes usar con clearTimeout() para cancelar la ejecución antes de que ocurra.

Pasar Argumentos a setTimeout

Puedes pasar argumentos adicionales a setTimeout() después del delay. Estos argumentos se pasarán a la función de callback cuando se ejecute. Esta es una forma más segura y eficiente que usar strings de código o closures para pasar valores.

settimeout-basico.js
Loading code...

El primer ejemplo muestra el uso básico de setTimeout() con una función anónima. El segundo ejemplo muestra cómo pasar argumentos a setTimeout(), lo cual es más eficiente que usar closures. El tercer ejemplo demuestra el comportamiento del delay 0, que coloca el código en la cola de tareas del event loop, por lo que se ejecuta después del código síncrono actual.

  • setTimeout() retorna un ID único que identifica el timeout
  • Puedes pasar argumentos adicionales después del delay
  • El delay es el tiempo mínimo, no garantizado
  • Un delay de 0 coloca el código en la cola de tareas del event loop

No uses strings en setTimeout

Evita usar strings de código en setTimeout() como setTimeout("alert('Hola')", 1000). Esto es inseguro y menos eficiente. Usa siempre funciones: setTimeout(() => alert('Hola'), 1000).

Método clearTimeout()

El método clearTimeout() cancela un timeout que aún no se ha ejecutado. Acepta el ID retornado por setTimeout() como argumento. Si el timeout ya se ejecutó o el ID no es válido, clearTimeout() no hace nada. Este método es útil para cancelar operaciones pendientes cuando el usuario interactúa con la interfaz o cuando ya no son necesarias.

cleartimeout-basico.js
Loading code...

El primer ejemplo muestra cómo cancelar un timeout antes de que se ejecute. El segundo ejemplo muestra un caso práctico de cancelar una notificación automática cuando el usuario interactúa con la interfaz. El tercer ejemplo demuestra el patrón debounce, una técnica común para limitar la frecuencia de ejecución de funciones en respuesta a eventos de entrada del usuario, especialmente útil en búsquedas y autocompletado.

Guardar IDs de timeouts

Siempre guarda el ID retornado por setTimeout() en una variable si planeas cancelarlo. Sin el ID, no puedes usar clearTimeout() para cancelar la ejecución.

setTimeout vs setInterval

Aunque setTimeout() y setInterval() parecen similares, tienen diferencias importantes. setTimeout() ejecuta código una vez después de un delay, mientras que setInterval() ejecuta código repetidamente con un intervalo específico. Para crear animaciones o ejecuciones repetidas, puedes usar setTimeout() recursivamente o setInterval() dependiendo de tus necesidades.

settimeout-vs-setinterval.js
Loading code...

El primer ejemplo muestra cómo usar setTimeout() recursivamente para crear una animación. Esta técnica te da más control sobre la ejecución, ya que puedes cancelar la animación fácilmente y ajustar el delay en cada iteración. El segundo ejemplo muestra cómo usar setInterval() para ejecutar código repetidamente con un intervalo fijo.

setTimeout recursivo vs setInterval

setTimeout() recursivo te da más control y puede ajustar el delay en cada iteración. setInterval() es más simple pero ejecuta código a intervalos fijos, lo cual puede causar problemas si la ejecución del código toma más tiempo que el intervalo.

Errores Comunes

Al trabajar con setTimeout() y clearTimeout(), existen varios errores comunes que los desarrolladores suelen cometer. Entender estos errores te ayudará a escribir código más robusto y evitar problemas de rendimiento y comportamiento inesperado.

errores-comunes.js
Loading code...

Los errores más comunes incluyen no guardar el ID del timeout (imposibilitando su cancelación), usar strings de código en setTimeout() (inseguro e ineficiente), asumir que el código se ejecuta exactamente en el tiempo especificado (el delay es el tiempo mínimo, no garantizado), y no cancelar timeouts innecesarios cuando el usuario hace múltiples acciones rápidamente (creando múltiples timeouts activos).

No uses setTimeout para operaciones críticas

setTimeout() no garantiza ejecución exacta en el tiempo especificado. Para operaciones críticas de tiempo, considera usar Web Workers, requestAnimationFrame, o APIs de tiempo del navegador.

Resumen: setTimeout y clearTimeout

Conceptos principales:

  • setTimeout() ejecuta código después de un delay especificado
  • clearTimeout() cancela un timeout pendiente
  • setTimeout() retorna un ID único para identificar el timeout
  • Puedes pasar argumentos adicionales a la función de callback
  • El delay es el tiempo mínimo, no garantizado

Mejores prácticas:

  • Usa funciones en lugar de strings en setTimeout()
  • Guarda el ID del timeout si planeas cancelarlo
  • Usa clearTimeout() para cancelar timeouts innecesarios
  • Considera setTimeout recursivo para animaciones
  • No uses setTimeout para operaciones críticas de tiempo