Saltar al contenido

JavaScript setTimeout y setInterval

En JavaScript, las funciones de temporización son esenciales para hacer que las aplicaciones web sean dinámicas e interactivas. setTimeout() y setInterval() son clave para gestionar cuándo se ejecuta el código. Esta guía cubre estas funciones en detalle, proporcionando consejos prácticos y ejemplos de código para usarlas de manera efectiva.

Introducción a las funciones de temporización en JavaScript

JavaScript, esencial para el desarrollo web, cuenta con funciones de temporización que ejecutan código en momentos establecidos. Entre estas, setTimeout y setInterval son especialmente útiles para programar tareas.

La función setTimeout()

La función setTimeout() te permite ejecutar un fragmento de código una vez después de un retraso especificado. Acepta dos parámetros: una función a ejecutar y un retraso en milisegundos antes de la ejecución.

Sintaxis:


javascript
setTimeout(function, delay);

Ejemplo:


Output appears here after Run.

La función setInterval()

Por el contrario, setInterval() ejecuta una función repetidamente a un intervalo especificado. Al igual que setTimeout(), acepta una función y un retraso en milisegundos. Ten en cuenta que si una función de retorno (callback) tarda más que el intervalo, las ejecuciones pueden superponerse o desincronizarse. Para una temporización precisa, considera usar setTimeout() de forma recursiva en su lugar.

Sintaxis:


javascript
setInterval(function, interval);

Ejemplo:


Output appears here after Run.

Cancelar la ejecución programada

JavaScript también proporciona métodos para cancelar la ejecución programada por setTimeout() y setInterval(), utilizando clearTimeout() y clearInterval() respectivamente.

Detener setTimeout():

Para cancelar un tiempo de espera, guarda el identificador devuelto por setTimeout() y pásalo a clearTimeout().

Ejemplo:


Output appears here after Run.

Detener setInterval():

De manera similar, para detener un intervalo, guarda el identificador de setInterval() y úsalo con clearInterval().

Ejemplo:


Output appears here after Run.

Aplicaciones prácticas y consejos

Comprender y utilizar setTimeout() y setInterval() va más allá de la sintaxis básica. Aquí tienes algunos consejos y prácticas avanzadas para un uso efectivo:

  • Debounce con setTimeout(): El debounce es una técnica para limitar la frecuencia con la que se ejecuta una función. Esto es especialmente útil en escenarios como campos de búsqueda, donde quizás no quieras disparar una llamada a la API con cada pulsación de tecla.

html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Debounced Input Example</title>
<script>
    // Debounce function to limit the rate at which a function is executed
    function debounce(func, wait) {
        let timeout;

        return function executedFunction(...args) {
            const later = () => {
                clearTimeout(timeout);
                func(...args);
            };

            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
        };
    }

    // Function to be debounced
    function fetchData(input) {
        alert(`API call with input: ${input}`); // Placeholder for an API call
    }

    // Create a debounced version of fetchData
    const debouncedFetchData = debounce(fetchData, 300);

    // Add the debounced function to an event listener
    function setup() {
        document.getElementById('searchInput').addEventListener('input', (event) => {
            debouncedFetchData(event.target.value);
        });
    }

    // Ensure setup is called once the document is fully loaded
    document.addEventListener('DOMContentLoaded', setup);
</script>
</head>
<body>
    <h3>Type in the input field:</h3>
    <input type="text" id="searchInput" placeholder="Start typing..." />
</body>
</html>

Result

  • Throttling con setTimeout(): El throttling asegura que una función se ejecute como máximo una vez cada cierto número de milisegundos. Esto puede ser útil para manejar eventos de desplazamiento sin sobrecargar el bucle de eventos del navegador. Ten en cuenta que el ejemplo a continuación utiliza un enfoque de borde inicial (ejecutándose inmediatamente en la primera llamada), lo cual puede no ser adecuado para todos los casos de uso en comparación con las alternativas de borde final.

html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Throttled Scroll Event</title>
<style>
  /* Simple styling for demonstration */
  body, html {
    height: 200%; /* Make the page scrollable */
    margin: 0;
    padding: 0;
    font-family: Arial, sans-serif;
  }
  #log {
    position: fixed;
    top: 0;
    left: 0;
    background: white;
    border: 1px solid #ccc;
    padding: 10px;
    width: 300px;
  }
</style>
</head>
<body>
<div id="log">Scroll to see the effect...</div>
<script>
// Throttle function using setTimeout
function throttle(func, limit) {
  let lastFunc;
  let lastRan;
  return function() {
    const context = this;
    const args = arguments;
    if (!lastRan) {
      func.apply(context, args);
      lastRan = Date.now();
    } else {
      clearTimeout(lastFunc);
      lastFunc = setTimeout(function() {
        if ((Date.now() - lastRan) >= limit) {
          func.apply(context, args);
          lastRan = Date.now();
        }
      }, Math.max(0, limit - (Date.now() - lastRan)));
    }
  }
}

// Function to be throttled
function handleScroll() {
  const log = document.getElementById('log');
  log.textContent = `Scroll event triggered at: ${new Date().toLocaleTimeString()}`;
}

// Add event listener for scroll
window.addEventListener('scroll', throttle(handleScroll, 1000));
</script>
</body>
</html>

Result

  • Retrasos en el Event Loop: Ten en cuenta que los retrasos de setTimeout() y setInterval() son mínimos. La ejecución real puede retrasarse si el bucle de eventos de JavaScript está ocupado o si el navegador limita las pestañas en segundo plano.
  • Límites de retraso máximo: La especificación de JavaScript limita los retrasos mayores que 2147483647 (2^31 - 1) milisegundos a 1. Los retrasos fuera de este rango no esperarán más; se ejecutarán casi de inmediato.
  • Uso en aplicaciones web: Estas funciones de temporización pueden mejorar la experiencia del usuario añadiendo animaciones, gestionando acciones basadas en el tiempo (como el guardado automático de formularios) y manejando operaciones asíncronas de manera más efectiva.

Conclusión

Dominar setTimeout() y setInterval() es crucial para cualquier desarrollador de JavaScript. Estas funciones son esenciales para programar tareas, ayudando a hacer que las aplicaciones web sean dinámicas y receptivas. Al aplicar las prácticas y ejemplos de esta guía, los desarrolladores pueden gestionar tareas impulsadas por el tiempo de manera efectiva, mejorando tanto el rendimiento de la aplicación como la experiencia del usuario.

Práctica

¿Cuáles de las siguientes afirmaciones son verdaderas respecto al uso de `setTimeout()` y `setInterval()` en JavaScript?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.