preloader

Planificación: setTimeout y setInterval en JavaScript

Planificación: setTimeout y setInterval

JavaScript ofrece métodos para diferir la ejecución de funciones no inmediatamente, sino después de un período específico. Esto se conoce como «programar una llamada».

setTimeout

El método setTimeout permite ejecutar una función una sola vez después de un tiempo determinado.

Sintaxis y Parámetros

La sintaxis básica es:

				
					let timerId = setTimeout(func|código, [retraso], [arg1], [arg2], ...)

				
			
  • func|código: Una función o una cadena de código que se ejecutará después del tiempo especificado.
  • retraso: El tiempo en milisegundos antes de que se ejecute la función, por defecto es 0.
  • arg1, arg2, …: Argumentos opcionales que se pasarán a la función cuando se llame.

Ejemplos de Uso

Por ejemplo, para llamar a sayHi después de un segundo:

				
					function sayHi() {
  alert('Hola');
}

setTimeout(sayHi, 1000);

				
			

Incluso puedes pasar argumentos a la función:

				
					function sayHi(phrase, who) {
  alert( phrase + ', ' + who );
}

setTimeout(sayHi, 1000, "Hola", "John"); // Hola, John

				
			

Si el primer argumento es una cadena, JavaScript lo convierte automáticamente en una función:

				
					setTimeout("alert('Hola')", 1000);

				
			

Sin embargo, es recomendable evitar el uso de cadenas y preferir funciones de flecha:

				
					setTimeout(() => alert('Hola'), 1000);

				
			

Evitar Errores Comunes

Es importante no añadir paréntesis después de la función:

				
					// ¡Incorrecto!
setTimeout(sayHi(), 1000);

				
			

Esto no funciona porque setTimeout espera una referencia a una función, pero sayHi() se ejecuta inmediatamente y no devuelve nada.

Cancelación con clearTimeout

setTimeout devuelve un identificador de temporizador (timerId) que se puede usar para cancelar la ejecución:

				
					let timerId = setTimeout(() => alert("No pasa nada"), 1000);
clearTimeout(timerId);

				
			

Esto cancelará la ejecución planificada y evitará que se muestre la alerta.

setInterval

A diferencia de setTimeout, setInterval ejecuta una función repetidamente cada cierto intervalo de tiempo:

				
					let timerId = setInterval(func|código, [retraso], [arg1], [arg2], ...)

				
			

Todos los parámetros tienen el mismo significado que en setTimeout, pero en lugar de ejecutarse una vez, la función se ejecutará repetidamente.

Detener llamadas repetidas con clearInterval

Para detener la ejecución repetida de setInterval, utilizamos clearInterval:

				
					let timerId = setInterval(() => alert('tick'), 2000);

setTimeout(() => { 
  clearInterval(timerId); 
  alert('stop'); 
}, 5000);

				
			

Uso de setTimeout Anidado

En lugar de setInterval, a veces es más flexible utilizar setTimeout anidado para ejecuciones regulares:

				
					let timerId = setTimeout(function tick() {
  alert('tick');
  timerId = setTimeout(tick, 2000); // Planificar la próxima ejecución
}, 2000);

				
			

Esto permite ajustar dinámicamente el tiempo entre llamadas, según sea necesario.

Retraso Cero en setTimeout

setTimeout(func, 0) o simplemente setTimeout(func) programa la ejecución de func lo más pronto posible después de que se complete el script actual.

				
					setTimeout(() => alert("Mundo"));

alert("Hola");

				
			

Esto mostrará primero «Hola» y luego «Mundo», ya que setTimeout con retraso cero se ejecuta después de que el script actual finalice.

Consideraciones Finales

JavaScript en el navegador tiene limitaciones en la frecuencia de ejecución de temporizadores anidados, estableciendo un retraso mínimo de 4 ms después de cinco llamadas consecutivas.

Es importante recordar que los métodos de planificación (setTimeout y setInterval) no garantizan un tiempo exacto de ejecución debido a factores como la carga de la CPU o el estado del sistema.

En resumen, setTimeout y setInterval son herramientas poderosas para controlar el tiempo de ejecución de funciones en JavaScript, cada una con su propia aplicación y consideraciones de uso.

Related Post

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *