JS 08: Temporizadores

Controla el tiempo: setTimeout y setInterval

1. ¿Qué son los Temporizadores?

Los temporizadores te permiten ejecutar código JavaScript después de un cierto tiempo o de forma repetida a intervalos regulares.

Analogía: El Despertador y el Metrónomo

  • setTimeout (El Despertador): Programa una alarma para que suene UNA VEZ después de X segundos.
  • setInterval (El Metrónomo): Suena REPETIDAMENTE cada X segundos hasta que lo detengas.

2. setTimeout: Ejecutar una vez después de un tiempo

setTimeout() ejecuta una función una sola vez después de esperar un número determinado de milisegundos (1000ms = 1 segundo).

Sintaxis

setTimeout(función, milisegundos);

// Ejemplo básico
setTimeout(function() {
    console.log("Han pasado 2 segundos");
}, 2000); // 2000 milisegundos = 2 segundos

Ejemplo con Función Flecha

// Versión moderna con arrow function
setTimeout(() => {
    console.log("Mensaje retrasado 3 segundos");
}, 3000);

Pasando Parámetros

function saludar(nombre, hora) {
    console.log(`Hola ${nombre}, son las ${hora}`);
}

// Los parámetros se pasan DESPUÉS del tiempo
setTimeout(saludar, 1000, "Ana", "10:30");

Ejemplo Interactivo

Esperando...

3. clearTimeout: Cancelar un setTimeout

Si guardas el ID que devuelve setTimeout, puedes cancelarlo antes de que se ejecute.

// Guardar el ID del temporizador
let timerId = setTimeout(() => {
    console.log("Esto no se ejecutará");
}, 5000);

// Cancelar antes de que se ejecute
clearTimeout(timerId);
console.log("Temporizador cancelado");

Ejemplo Interactivo: Cancelar setTimeout

Sin temporizador activo

4. setInterval: Ejecutar repetidamente

setInterval() ejecuta una función repetidamente cada X milisegundos hasta que lo detengas.

Sintaxis

setInterval(función, milisegundos);

// Ejemplo: Reloj que imprime la hora cada segundo
setInterval(() => {
    console.log(new Date().toLocaleTimeString());
}, 1000);

⚠️ Importante: Siempre Detener setInterval

Si no detienes un setInterval, seguirá ejecutándose para siempre, consumiendo recursos.

// ❌ MAL: Esto nunca se detiene
setInterval(() => {
    console.log("Esto se ejecuta infinitamente");
}, 1000);

// ✅ BIEN: Guardamos el ID para poder detenerlo
let intervalId = setInterval(() => {
    console.log("Mensaje cada segundo");
}, 1000);

// Detener después de 5 segundos
setTimeout(() => {
    clearInterval(intervalId);
    console.log("Intervalo detenido");
}, 5000);

5. clearInterval: Detener un setInterval

Para detener un setInterval, usamos clearInterval() con el ID que nos devolvió.

Ejemplo: Contador con Inicio y Detención

0
let contador = 0;
let intervalId = null;

function iniciarContador() {
    if (intervalId) return; // Evitar múltiples intervalos
    
    intervalId = setInterval(() => {
        contador++;
        document.getElementById('contador').textContent = contador;
    }, 1000);
}

function detenerContador() {
    clearInterval(intervalId);
    intervalId = null;
}

function reiniciarContador() {
    detenerContador();
    contador = 0;
    document.getElementById('contador').textContent = contador;
}

6. Casos de Uso Prácticos

Cuenta Regresiva

function cuentaRegresiva(segundos) {
    let tiempo = segundos;
    
    const intervalId = setInterval(() => {
        console.log(tiempo);
        tiempo--;
        
        if (tiempo < 0) {
            clearInterval(intervalId);
            console.log("¡Tiempo terminado!");
        }
    }, 1000);
}

cuentaRegresiva(10); // Cuenta desde 10 hasta 0

Animación Simple

let posicion = 0;
const elemento = document.getElementById('objeto');

const animacion = setInterval(() => {
    posicion += 5;
    elemento.style.left = posicion + 'px';
    
    if (posicion >= 300) {
        clearInterval(animacion);
    }
}, 50); // Se mueve cada 50ms (20 veces por segundo)

Auto-guardado

// Guardar datos cada 30 segundos
setInterval(() => {
    guardarDatosEnLocalStorage();
    console.log("Datos guardados automáticamente");
}, 30000); // 30000ms = 30 segundos

7. setTimeout vs setInterval: ¿Cuál usar?

Situación Usar Ejemplo
Ejecutar algo UNA vez más tarde setTimeout Mostrar notificación después de 3s
Repetir algo constantemente setInterval Actualizar reloj cada segundo
Animaciones suaves requestAnimationFrame Movimientos fluidos (tema avanzado)
Encadenar tareas con retraso setTimeout recursivo Polling adaptativo

8. Buenas Prácticas

✅ Recomendaciones

  • Siempre guarda el ID del temporizador si necesitas cancelarlo
  • Usa clearInterval cuando ya no necesites la repetición
  • Evita usar setInterval para tareas lentas (usa setTimeout recursivo)
  • Recuerda que los tiempos son mínimos, no garantizados (el navegador puede retrasarlos)
  • Para animaciones profesionales, prefiere requestAnimationFrame

❌ Errores Comunes

  • No detener un setInterval (fuga de memoria)
  • Confundir milisegundos con segundos (1000ms = 1s)
  • Intentar usar clearTimeout con un ID de setInterval (o viceversa) - Nota técnica: Aunque funciona en la práctica (ambos comparten el mismo pool de IDs), es mala práctica porque genera confusión y no está garantizado por la especificación. Usa siempre el clear* que corresponda.
  • Crear múltiples intervalos sin control
Volver a JS