Quatro formas de combinar promessas
Quando você tem várias promessas de uma vez, raramente quer esperá-las uma a
uma. A classe Promise oferece quatro métodos estáticos que recebem um array
(iterável) de promessas e devolvem uma única promessa que as coordena.
Promise.all — "todas ou nenhuma"
Dispara todas em paralelo e se cumpre com um array de resultados (na mesma
ordem) quando todas se cumprem. Se uma única for rejeitada, all é
rejeitada imediatamente com esse erro (as demais continuam rodando, mas seu
resultado é ignorado).
const [usuario, pedidos] = await Promise.all([pedirUsuario(), pedirPedidos()]);
Use quando você precisa de todos os resultados e a falha de qualquer uma invalida o conjunto. É como um menu: se falta um prato, você não serve a refeição.
Promise.allSettled — "me conte como cada uma se saiu"
Espera que todas terminem (sejam cumpridas ou rejeitadas) e nunca é rejeitada. Devolve um array de objetos com o estado de cada uma:
{ status: "fulfilled", value: ... }{ status: "rejected", reason: ... }
const resultados = await Promise.allSettled([pedirA(), pedirB()]);
const sucessos = resultados.filter((r) => r.status === "fulfilled");
Use quando você quer tentar tudo e depois revisar o balanço, sem que uma falha isolada coloque tudo o resto a perder (enviar 100 e-mails, subir vários arquivos...).
Promise.race — "a primeira a terminar, ganhe ou perca"
Resolve ou rejeita com a primeira promessa que mudar de estado, seja cumprida ou rejeitada.
const vencedora = await Promise.race([pedirDados(), tempoLimite(5000)]);
Clássico para colocar um timeout: você corre sua requisição contra um temporizador que rejeita; ganhe quem ganhar, você não fica esperando para sempre.
Promise.any — "a primeira a ter SUCESSO"
Cumpre com a primeira que se cumprir e ignora as rejeições. Só é
rejeitada se todas falharem (com um AggregateError que agrupa os erros).
const maisRapido = await Promise.any([servidor1(), servidor2(), servidor3()]);
Use quando você tem várias fontes equivalentes e basta a primeira que responder bem (réplicas de um servidor, espelhos de download...).
Resumo rápido
| Método | Cumpre quando... | Rejeita quando... |
|---|---|---|
all |
todas se cumprem | a primeira é rejeitada |
allSettled |
todas terminam | nunca |
race |
a primeira termina (sucesso) | a primeira termina (falha) |
any |
a primeira se cumpre | todas são rejeitadas |
Exemplos
all paraleliza e devolve um 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 é rejeitada: te dá o balanço
async function demo() {
const r = await Promise.allSettled([
Promise.resolve("ok"),
Promise.reject(new Error("falhou")),
]);
console.log(r[0].status, "/", r[1].status); // fulfilled / rejected
}
demo();
any fica com a primeira que tem sucesso
async function demo() {
const valor = await Promise.any([
Promise.reject(new Error("lento")),
Promise.resolve("rápido"),
]);
console.log(valor); // "rápido"
}
demo();