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:
{ status: "fulfilled", value: ... }{ status: "rejected", reason: ... }
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();