JavaScript/Assincronismo/Promises
JavaScript⏱ ~2 min de leitura

Promises

Criando e encadeando Promises

Uma Promise representa um valor que pode estar disponível agora, no futuro, ou nunca. Tem três estados: pending (aguardando), fulfilled (resolvida com sucesso) e rejected (falhou com erro). Uma Promise resolve ou rejeita uma única vez e nunca muda de estado após isso.

O encadeamento de Promises usa .then() para mapear o resultado de uma Promise em outra, criando um pipeline. Cada .then() recebe o valor resolvido e pode retornar um novo valor ou outra Promise — que será aguardada automaticamente. .catch() captura qualquer rejeição na cadeia, como um bloco catch global.

Promise.all() executa múltiplas Promises em paralelo e retorna uma Promise que resolve com um array de resultados quando todas completam — ou rejeita imediatamente se qualquer uma falhar. Promise.allSettled() espera todas terminarem independente de sucesso/falha. Promise.race() retorna a primeira que completar. Promise.any() retorna a primeira que tiver sucesso.

Exemplo.java
// ── Criando uma Promise ───────────────────────────
const minhaPromise = new Promise((resolve, reject) => {
  const sucesso = Math.random() > 0.5;
  setTimeout(() => {
    if (sucesso) resolve("Dados carregados!");
    else reject(new Error("Falha na conexão"));
  }, 1000);
});

// ── Encadeamento .then() / .catch() ───────────────
minhaPromise
  .then(dados => dados.toUpperCase())   // transforma
  .then(resultado => console.log(resultado))
  .catch(erro => console.error(erro.message))
  .finally(() => console.log("Sempre executa"));

// ── fetch retorna Promise ─────────────────────────
fetch("https://api.github.com/users/octocat")
  .then(res => {
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    return res.json();          // também é uma Promise
  })
  .then(usuario => console.log(usuario.name))
  .catch(erro => console.error("Erro:", erro));

// ── Paralelo com Promise.all ──────────────────────
const p1 = fetch("/api/usuarios").then(r => r.json());
const p2 = fetch("/api/produtos").then(r => r.json());

Promise.all([p1, p2])
  .then(([usuarios, produtos]) => {
    console.log(usuarios.length, produtos.length);
  });

// ── Promise.allSettled: espera todas ─────────────
Promise.allSettled([p1, p2]).then(resultados => {
  resultados.forEach(r => {
    if (r.status === "fulfilled") console.log(r.value);
    else console.error(r.reason);
  });
});
💡 Dica pro

Nunca crie "Promise Hell" (then aninhados dentro de then). Se um .then() retorna uma Promise, encadeie um novo .then() — o JS achata automaticamente. Isso mantém a cadeia linear.

Recompensa+35 XP+exercícios