Hoy · Hoja de ruta
- 1. Aprende: Por qué JavaScript no espera, y qué es el bucle de eventos.
- 2. Haz: Predice el orden de ejecución de varios fragmentos.
- 3. Comprueba: Explicas por qué un valor «llega vacío» cuando llega tarde.
Antes de empezar · 5 minutos, sin apuntes
- Si pedir datos a un servidor tarda dos segundos, ¿qué debería hacer la página mientras tanto?
- ¿Puede la página quedarse congelada? ¿Por qué sería grave?
- ¿En qué orden crees que se ejecutan tres líneas si la de en medio tarda?
Un solo hilo
JavaScript ejecuta una cosa cada vez. Si una operación bloquea, se bloquea todo: no responden los clics, no se desplaza la página, no se reproduce una animación.
Por eso las operaciones lentas —una petición de red, un temporizador, leer un fichero— no se esperan. Se encargan, y el resultado llega después.
console.log("1");
setTimeout(() => console.log("2"), 0);
console.log("3");
// 1, 3, 2
Aunque el retraso sea cero. La función encargada se pone en cola y se ejecuta cuando el trabajo actual termina.
- Se ejecuta el código actual hasta el final
- Las tareas lentas se encargan fuera
- Cuando terminan, su función entra en la cola
- El bucle de eventos la ejecuta cuando hay hueco
El fallo que produce
let productos = [];
setTimeout(() => {
productos = [{ nombre: "Teclado" }];
}, 1000);
console.log(productos.length); // 0, no 1
No es que el array esté mal: es que se mira antes de tiempo. Cuando en la sesión 15 pidas datos al servidor y te salga una lista vacía, esta será la primera sospecha.
Un valor que llega tarde no se puede leer pronto
La consecuencia práctica es una regla de diseño: todo lo que dependa del dato tiene que ocurrir dentro de lo que se ejecuta cuando el dato llega, no en la línea de después.
La sintaxis para escribir eso sin acabar con seis niveles de anidamiento es la de mañana.
Temporizadores
const id = setTimeout(() => console.log("Una vez"), 1000);
clearTimeout(id);
const otro = setInterval(() => console.log("Cada segundo"), 1000);
clearInterval(otro);
Guarda siempre el identificador: un intervalo que nadie detiene sigue corriendo mientras la página esté abierta.
Tarea 13 · Predecir el orden
- Escribe cinco fragmentos que mezclen código normal y temporizadores; predice el orden y compruébalo.
- Reproduce el fallo del array vacío y explícalo por escrito.
- Simula una carga de dos segundos que muestre un mensaje de «cargando» y luego los datos.
- Monta un contador con
setIntervaly detenlo con un botón. - Provoca un intervalo no detenido y observa el efecto en consola.
Checkpoint · fin de la sesión 13
- Explicas por qué JavaScript no espera a lo lento.
- Predices el orden con temporizadores de por medio.
- Reconoces el fallo del valor leído antes de tiempo.
- Detienes los temporizadores que creas.
Ver respuestas
1 · Porque tiene un solo hilo: esperar bloquearía toda la interfaz.
2 · Al final, después del código actual, aunque el retraso sea cero.
3 · Que el dato aún no había llegado cuando se leyó.