
Comprender el modelo de ejecución asíncrona y el uso de callbacks en JavaScript.
JavaScript asíncrono y Event Loop
- Single-threaded: JavaScript ejecuta una sola tarea a la vez, pero no bloquea porque delega tareas a APIs del navegador (timers, red, DOM). Esto explica por que un
fetchno congela la UI. - Call Stack: Pila donde se ejecutan funciones; si una funcion tarda, bloquea el hilo. Todo lo sincrono pasa por aqui.
- Web APIs + Colas: Al terminar tareas externas, los callbacks pasan a colas de macrotasks (
setTimeout,setInterval, I/O) o microtasks (promesas). Se encolan, no se ejecutan de inmediato. - Orden de ejecucion: Se vacia el stack, luego se procesan microtasks, y recien despues una macrotask. Esto puede repetirse varias veces en un mismo "tick".
- Consecuencia practica:
Promise.thense ejecuta antes quesetTimeout(..., 0). - Modelo mental: "Pila vacia -> microtasks -> una macrotask -> repetir". Si la pila nunca se vacia, nada encola.
javascript1console.log("Inicio"); 2setTimeout(() => console.log("Timeout"), 0); 3Promise.resolve().then(() => console.log("Promesa")); 4console.log("Fin"); 5// Resultado: Inicio, Fin, Promesa, Timeout
javascript1// Microtask queue con múltiples then 2Promise.resolve() 3 .then(() => console.log("Micro 1")) 4 .then(() => console.log("Micro 2")); 5 6setTimeout(() => console.log("Macro"), 0);
javascript1// Bloqueo del hilo por tarea sincrona larga 2console.log("Antes"); 3const inicio = Date.now(); 4while (Date.now() - inicio < 2000) {} // bloquea 2s 5console.log("Despues");
javascript1// Ejemplo minimo del "tick" 2console.log("A"); 3Promise.resolve().then(() => console.log("B")); 4setTimeout(() => console.log("C"), 0); 5console.log("D"); 6// A, D, B, C
Callbacks
- Qué son: Funciones que se pasan como argumento para ejecutarse luego.
- Casos de uso: Eventos, temporizadores, peticiones simuladas y procesamiento en secuencia.
- Firma comun: En Node es tipico el estilo error-first:
(err, data) => {}. - Contrato: Un callback puede llamarse una sola vez; si se llama multiples veces, hay bugs sutiles.
javascript1function cargarDatos(callback) { 2 setTimeout(() => { 3 callback({ nombre: "Juan", edad: 30 }); 4 }, 1000); 5}
javascript1// Callback estilo error-first (Node.js) 2function leerArchivoSimulado(ok, fail) { 3 const exito = Math.random() > 0.2; 4 setTimeout(() => { 5 if (exito) return ok("contenido"); 6 return fail(new Error("No se pudo leer")); 7 }, 500); 8}
Callback Hell
- Anidamientos profundos que dificultan lectura, mantenimiento y manejo de errores.
- Motivación para usar promesas y async/await.
- Señal de alarma: callbacks que dependen de resultados anteriores y multiples niveles de indentacion.
javascript1// Ejemplo de callback hell 2login(user, (u) => { 3 cargarPerfil(u.id, (perfil) => { 4 cargarPosts(perfil.id, (posts) => { 5 render(posts); 6 }, onError); 7 }, onError); 8}, onError);
Ejemplos de Código
3 ejemplos
Temporizador simple
javascript
1setTimeout(() => console.log("Hola"), 1000);Callback con validación
javascript
1function procesar(valor, ok, fail) {
2 if (valor > 0) return ok(valor);
3 return fail("Valor inválido");
4}Orden de tareas
javascript
1Promise.resolve().then(() => console.log("Microtask"));
2setTimeout(() => console.log("Macrotask"), 0);Recursos
3 recursos disponibles
¡Hora de Practicar!
PrácticaIntermedio15 min
Práctica guiada - Event Loop
Práctica
Simular tiempos con setTimeout y setInterval, observar el orden en consola.
Desafío de Código
EjercicioIntermedio15 min
Ejercicios - Callbacks
Ejercicios
(1) Contador con delay, (2) simulador de descarga, (3) ejecutar callbacks en secuencia.
Documentación Oficial
DocumentaciónIntermedio15 min
MDN - Event Loop
Explicación del ciclo de eventos y colas de tareas.