Command Palette

Search for a command to run...

setInterval y clearInterval: Ejecución Repetida de Código

Aprende a ejecutar código repetidamente usando setInterval y cancelar intervalos con clearInterval.

Lectura: 12 min
Nivel: Principiante

TL;DR - Resumen rápido

  • setInterval() ejecuta código repetidamente con un intervalo especificado
  • clearInterval() cancela un intervalo activo
  • setInterval() retorna un ID que se usa para cancelar el intervalo
  • Puedes pasar argumentos adicionales a la función de callback
  • setInterval() puede causar acumulación si la ejecución toma más tiempo que el intervalo

Introducción a setInterval y clearInterval

Los métodos setInterval() y clearInterval() te permiten ejecutar código repetidamente con un intervalo específico. setInterval() ejecuta una función o evalúa una expresión repetidamente cada número de milisegundos especificado, mientras que clearInterval() cancela un intervalo activo. Estos métodos son fundamentales para crear animaciones, relojes, polling, y cualquier funcionalidad que requiera ejecución periódica.

Es importante entender que setInterval() no garantiza que el código se ejecute exactamente en el intervalo especificado. El intervalo es el tiempo mínimo entre ejecuciones, 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. Además, si la ejecución del código toma más tiempo que el intervalo, las ejecuciones pueden acumularse.

  • setInterval() - ejecuta código repetidamente con un intervalo especificado
  • clearInterval() - cancela un intervalo activo
  • setInterval() retorna un ID único para identificar el intervalo
  • El intervalo es el tiempo mínimo entre ejecuciones
  • Útil para animaciones, relojes, polling y tareas periódicas

Acumulación de ejecuciones

Si la ejecución del código en setInterval() toma más tiempo que el intervalo, las ejecuciones pueden acumularse en la cola. Esto puede causar problemas de rendimiento y comportamiento inesperado.

Método setInterval()

El método setInterval() acepta una función o una string de código a ejecutar, y un intervalo 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 clearInterval() para cancelar la ejecución periódica.

setinterval-basico.js
Loading code...

El primer ejemplo muestra el uso básico de setInterval() con una función anónima. El segundo ejemplo muestra cómo pasar argumentos a setInterval(), lo cual es más eficiente que usar closures. El tercer ejemplo muestra cómo usar una función con nombre, lo cual mejora la legibilidad y permite reutilizar la función.

No uses strings en setInterval

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

Método clearInterval()

El método clearInterval() cancela un intervalo activo. Acepta el ID retornado por setInterval() como argumento. Si el intervalo ya se canceló o el ID no es válido, clearInterval() no hace nada. Este método es útil para detener animaciones, relojes, polling, y cualquier funcionalidad periódica cuando ya no es necesaria.

clearinterval-basico.js
Loading code...

El primer ejemplo muestra cómo cancelar un intervalo después de un tiempo específico. El segundo ejemplo muestra cómo usar clearInterval() en un caso práctico: detener un reloj cuando el usuario hace clic. El tercer ejemplo muestra cómo cancelar múltiples intervalos usando un array de IDs.

Guardar IDs de intervalos

Siempre guarda el ID retornado por setInterval() en una variable si planeas cancelarlo. Sin el ID, no puedes usar clearInterval() para detener la ejecución periódica.

setInterval vs setTimeout Recursivo

Aunque setInterval() y setTimeout() recursivo parecen similares para ejecutar código repetidamente, tienen diferencias importantes. setInterval() ejecuta código a intervalos fijos, mientras que setTimeout() recursivo te da más control sobre la ejecución, ya que puedes ajustar el delay en cada iteración y evitar la acumulación de ejecuciones.

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

El primer ejemplo muestra cómo usar setInterval() para crear un reloj simple. Esta técnica es simple pero puede causar acumulación si la ejecución del código toma más tiempo que el intervalo. El segundo ejemplo muestra cómo usar setTimeout() recursivamente, lo cual te da más control y evita la acumulación de ejecuciones.

  • setInterval() - intervalos fijos, más simple para tareas constantes
  • setTimeout() recursivo - más control, ajustas el delay en cada iteración
  • setInterval() puede acumular ejecuciones si el código es lento
  • setTimeout() recursivo evita acumulación al esperar a que termine cada ejecución
  • requestAnimationFrame es mejor que ambos para animaciones complejas

setTimeout recursivo para animaciones

Para animaciones, considera usar setTimeout() recursivo en lugar de setInterval(). Esto te da más control sobre la ejecución y evita problemas de acumulación cuando el código toma más tiempo que el intervalo.

Acumulación de Ejecuciones

Uno de los problemas más comunes con setInterval() es la acumulación de ejecuciones. Esto ocurre cuando la ejecución del código toma más tiempo que el intervalo especificado, lo cual causa que las ejecuciones se acumulen en la cola y se ejecuten una tras otra sin el delay esperado. Esto puede causar problemas de rendimiento significativos y comportamiento inesperado.

acumulacion-ejecuciones.js
Loading code...

El primer ejemplo muestra el problema de acumulación con setInterval(). Cuando la ejecución del código toma más tiempo que el intervalo, las ejecuciones se acumulan y se ejecutan una tras otra. El segundo ejemplo muestra cómo usar setTimeout() recursivo para evitar la acumulación, ya que cada ejecución programa la siguiente solo después de terminar.

Evitar acumulación en setInterval

Si tu código puede tomar más tiempo que el intervalo, considera usar setTimeout() recursivo en lugar de setInterval(). Esto evita la acumulación de ejecuciones y problemas de rendimiento.

Errores Comunes

Al trabajar con setInterval() y clearInterval(), 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...

El primer error es no guardar el ID del intervalo, lo cual impide cancelar la ejecución. El segundo error es usar strings de código en setInterval(), lo cual es inseguro y menos eficiente. El tercer error es no considerar la acumulación de ejecuciones, lo cual puede causar problemas de rendimiento significativos.

No uses setInterval para animaciones complejas

Para animaciones complejas, considera usar requestAnimationFrame en lugar de setInterval(). requestAnimationFrame está optimizado para animaciones y se sincroniza con el refresco de la pantalla.

Resumen: setInterval y clearInterval

Conceptos principales:

  • setInterval() ejecuta código repetidamente con un intervalo especificado
  • clearInterval() cancela un intervalo activo
  • setInterval() retorna un ID único para identificar el intervalo
  • Puedes pasar argumentos adicionales a la función de callback
  • setInterval() puede causar acumulación de ejecuciones

Mejores prácticas:

  • Usa funciones en lugar de strings en setInterval()
  • Guarda el ID del intervalo si planeas cancelarlo
  • Considera setTimeout recursivo para evitar acumulación
  • Usa requestAnimationFrame para animaciones
  • No uses setInterval para operaciones críticas de tiempo