DevPath · Aprenda a programar ESPTEN

Assincronia: promessas e async/await

Combinadores de promessas

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:

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();
Coloque isto em prática

O DevPath é um curso prático: aqui você lê a teoria; no app você a coloca em prática com exercícios que rodam de verdade, offline.

Comece grátis no app →
← Microtarefas vs macrotarefasErros assíncronos →