
Crear, encadenar y manejar promesas con combinadores modernos.
Fundamentos de Promesas
- Estados: pending (pendiente), fulfilled (resuelta), rejected (rechazada).
- Encadenamiento:
thenrecibe el valor resuelto y devuelve otro valor o promesa. Si devuelve un valor, la promesa siguiente se resuelve con ese valor. - Errores:
catchcaptura errores en cualquier punto de la cadena. Un error lanzado dentro dethensalta al primercatch. - Limpieza:
finallyse ejecuta siempre, ideal para ocultar loaders. - Promesa "envolvente": Si devuelves una promesa dentro de
then, la cadena espera a que esa promesa termine.
javascript1const promesa = new Promise((resolve, reject) => { 2 setTimeout(() => resolve("OK"), 1000); 3}); 4 5promesa 6 .then((res) => res + "!") 7 .then((res) => console.log(res)) 8 .catch((err) => console.error(err)) 9 .finally(() => console.log("Fin"));
Encadenamiento
- Pasar datos entre
.then()para crear flujos secuenciales. - Mejor legibilidad que los callbacks anidados.
- Regla clave: cada
thendebe devolver algo (valor o promesa) para mantener el flujo.
javascript1const getUser = () => Promise.resolve({ id: 1 }); 2const getPosts = (id) => Promise.resolve(["a", "b"]); 3 4getUser() 5 .then((u) => getPosts(u.id)) 6 .then((posts) => console.log("Posts:", posts)) 7 .catch((err) => console.error("Fallo:", err));
Combinadores
- Promise.all: Espera todas; si una falla, falla todo. Útil cuando necesitas todos los datos.
- Promise.allSettled: Espera todas sin importar fallos. Útil para mostrar resultados parciales.
- Promise.race: Devuelve la primera en completarse (éxito o error). Útil para timeouts.
- Promise.any: Devuelve la primera que se resuelve correctamente; si todas fallan, lanza error.
javascript1const a = fetch("/api/a"); 2const b = fetch("/api/b"); 3 4Promise.all([a, b]).then(async ([ra, rb]) => { 5 const dataA = await ra.json(); 6 const dataB = await rb.json(); 7 console.log(dataA, dataB); 8}); 9 10const timeout = new Promise((_, reject) => 11 setTimeout(() => reject("Timeout"), 2000) 12); 13Promise.race([fetch("/api"), timeout]);
javascript1// allSettled para mostrar resultados parciales 2Promise.allSettled([fetch("/a"), fetch("/b")]).then((results) => { 3 results.forEach((r) => console.log(r.status)); 4});
javascript1// any: primera promesa resuelta correctamente 2Promise.any([ 3 Promise.reject("Error A"), 4 Promise.resolve("OK B"), 5]).then((v) => console.log(v));
Ejemplos de Código
3 ejemplos
Crear promesa
javascript
1const p = new Promise((resolve) => setTimeout(resolve, 500));Promesas en paralelo
javascript
1Promise.all([p1, p2]).then(([a, b]) => console.log(a, b));Timeout con race
javascript
1const timeout = new Promise((_, reject) => setTimeout(() => reject("Timeout"), 2000));
2Promise.race([fetch("/api"), timeout]);Recursos
3 recursos disponibles
¡Hora de Practicar!
PrácticaIntermedio15 min
Práctica guiada - Refactor a promesas
Práctica
Reescribir ejercicios de callbacks usando promesas.
Desafío de Código
EjercicioIntermedio15 min
Ejercicios - Combinadores
Ejercicios
(1) Cargar recursos con Promise.all, (2) aplicar timeout con race, (3) manejar errores con allSettled.
Documentación Oficial
DocumentaciónIntermedio15 min
JavaScript.info - Promises
Introducción clara a promesas y patrones comunes.