Promesas (Promises)
Volver a clases
Frontend Development●●Intermedio

Promesas (Promises)

120 min
0 vistas

Crear, encadenar y manejar promesas con combinadores modernos.

Fundamentos de Promesas

  • Estados: pending (pendiente), fulfilled (resuelta), rejected (rechazada).
  • Encadenamiento: then recibe el valor resuelto y devuelve otro valor o promesa. Si devuelve un valor, la promesa siguiente se resuelve con ese valor.
  • Errores: catch captura errores en cualquier punto de la cadena. Un error lanzado dentro de then salta al primer catch.
  • Limpieza: finally se ejecuta siempre, ideal para ocultar loaders.
  • Promesa "envolvente": Si devuelves una promesa dentro de then, la cadena espera a que esa promesa termine.
javascript
1const 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 then debe devolver algo (valor o promesa) para mantener el flujo.
javascript
1const 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.
javascript
1const 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]);
javascript
1// allSettled para mostrar resultados parciales
2Promise.allSettled([fetch("/a"), fetch("/b")]).then((results) => {
3  results.forEach((r) => console.log(r.status));
4});
javascript
1// 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.

ALVESC ACADEMY - Plataforma Educativa