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.
// ── 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);
});
});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.