DevPath · Aprende a programar ESPTEN

Asincronía: promesas y async/await

Combinadores de promesas

Cuatro formas de combinar promesas

Cuando tienes varias promesas a la vez, rara vez quieres esperarlas una a una. La clase Promise ofrece cuatro métodos estáticos que reciben un array (iterable) de promesas y devuelven una sola promesa que las coordina.

Promise.all — "todas o ninguna"

Lanza todas en paralelo y se cumple con un array de resultados (en el mismo orden) cuando todas se cumplen. Si una sola se rechaza, all se rechaza inmediatamente con ese error (las demás siguen corriendo, pero su resultado se ignora).

const [usuario, pedidos] = await Promise.all([pedirUsuario(), pedirPedidos()]);

Úsalo cuando necesitas todos los resultados y el fallo de cualquiera invalida el conjunto. Es como un menú: si falta un plato, no sirves la comida.

Promise.allSettled — "cuéntame cómo le fue a cada una"

Espera a que todas terminen (se cumplan o se rechacen) y nunca se rechaza. Devuelve un array de objetos con el estado de cada una:

const resultados = await Promise.allSettled([pedirA(), pedirB()]);
const exitos = resultados.filter((r) => r.status === "fulfilled");

Úsalo cuando quieres intentarlo todo y luego revisar el balance, sin que un fallo aislado eche por tierra el resto (enviar 100 emails, subir varios archivos...).

Promise.race — "la primera que termine, gane o pierda"

Se resuelve o rechaza con la primera promesa que cambie de estado, sea cumplida o rechazada.

const ganadora = await Promise.race([pedirDatos(), tiempoLimite(5000)]);

Clásico para poner un timeout: corres tu petición contra un temporizador que rechaza; gane quien gane, no te quedas esperando para siempre.

Promise.any — "la primera que tenga ÉXITO"

Se cumple con la primera que se cumpla e ignora los rechazos. Solo se rechaza si todas fallan (con un AggregateError que agrupa los errores).

const masRapido = await Promise.any([servidor1(), servidor2(), servidor3()]);

Úsalo cuando tienes varias fuentes equivalentes y te basta con la primera que responda bien (réplicas de un servidor, espejos de descarga...).

Resumen rápido

Método Se cumple cuando... Se rechaza cuando...
all todas se cumplen la primera se rechaza
allSettled todas terminan nunca
race la primera termina (éxito) la primera termina (fallo)
any la primera se cumple todas se rechazan

Ejemplos

all paraleliza y devuelve un array ordenado

async function demo() {
  const resultados = await Promise.all([
    Promise.resolve(1),
    Promise.resolve(2),
    Promise.resolve(3),
  ]);
  console.log(resultados); // [1, 2, 3]
}
demo();

allSettled nunca se rechaza: te da el balance

async function demo() {
  const r = await Promise.allSettled([
    Promise.resolve("ok"),
    Promise.reject(new Error("falló")),
  ]);
  console.log(r[0].status, "/", r[1].status); // fulfilled / rejected
}
demo();

any se queda con la primera que tiene éxito

async function demo() {
  const valor = await Promise.any([
    Promise.reject(new Error("lento")),
    Promise.resolve("rápido"),
  ]);
  console.log(valor); // "rápido"
}
demo();
Pon esto en práctica

DevPath es un curso práctico: aquí lees la teoría; en la app la pones en práctica con ejercicios que se ejecutan de verdad, sin conexión.

Empezar gratis en la app →
← Microtareas vs macrotareasErrores asíncronos →