Consumindo Promises: then(), catch() e finally()

Descubra como lidar com o sucesso, o erro e a finalização de uma Promise.

Na lição anterior, você viu o que é uma Promise.
Agora vamos focar em como consumir essa Promise no dia a dia.

Pense assim: a Promise é como um pedido que você fez.
Os métodos abaixo são as etapas de acompanhamento:

  • then() → quando deu certo
  • catch() → quando deu erro
  • finally() → quando terminou, independente do resultado

1) then() — tratando sucesso

O then() roda quando a Promise é resolvida com sucesso.

const promessa = Promise.resolve("Dados carregados!");

promessa.then(function (resultado) {
  console.log(resultado); // Dados carregados!
});

2) catch() — tratando erro

O catch() roda quando a Promise é rejeitada.

const promessaComErro = Promise.reject("Falha ao carregar dados.");

promessaComErro.catch(function (erro) {
  console.log(erro); // Falha ao carregar dados.
});

3) finally() — sempre executa

O finally() roda no final, com sucesso ou erro.

Promise.resolve("OK")
  .then(function (res) {
    console.log(res);
  })
  .catch(function (err) {
    console.log(err);
  })
  .finally(function () {
    console.log("Processo finalizado.");
  });

Muito útil para esconder loading, encerrar animação, liberar botão etc.


Encadeando corretamente

Você pode encadear vários then() para transformar dados em etapas:

Promise.resolve(10)
  .then(function (n) {
    return n * 2; // 20
  })
  .then(function (n) {
    return n + 5; // 25
  })
  .then(function (resultadoFinal) {
    console.log(resultadoFinal); // 25
  })
  .catch(function (erro) {
    console.log("Erro:", erro);
  })
  .finally(function () {
    console.log("Fim da execução");
  });

Erro em qualquer etapa cai no catch()

Se alguma etapa lançar erro, o catch() captura:

Promise.resolve("início")
  .then(function () {
    throw new Error("Algo deu errado no meio do caminho");
  })
  .then(function () {
    console.log("Essa etapa não roda");
  })
  .catch(function (erro) {
    console.log("Erro capturado:", erro.message);
  });

Boas práticas

  • Sempre tenha catch() em operações assíncronas reais.
  • Use finally() para ações de limpeza/finalização.
  • Retorne valores dentro de then() quando quiser encadear.
  • Evite misturar muita lógica em um único then().

Resumo da lição

  • then() trata sucesso.
  • catch() trata falha.
  • finally() sempre executa no fim.
  • Juntos, eles deixam o fluxo assíncrono mais claro e organizado.