Médio JavaScript

Encadeamento com tratamento de erro

Enunciado

Crie uma função dividir(a, b) que retorna uma Promise. Se b for zero, rejeite com new Error('Divisão por zero'). Caso contrário, resolva com o resultado da divisão. Use encadeamento de .then() para calcular (10 / 2) / 5 e depois .catch() para tratar erros. Exiba o resultado final ou a mensagem de erro.

Requisitos

  • A função dividir deve retornar uma Promise.
  • Se b === 0, a Promise deve ser rejeitada com a mensagem 'Divisão por zero'.
  • O encadeamento deve calcular (10 / 2) / 5 usando dois .then().
  • Use .catch() para capturar qualquer erro e exibir a mensagem.
  • Exiba o resultado final no console.

Código inicial

function dividir(a, b) {
  // Seu código aqui
}

dividir(10, 2)
  .then(resultado => {
    // continue o encadeamento
  })
  .then(resultadoFinal => {
    // exiba o resultado final
  })
  .catch(erro => {
    // exiba a mensagem de erro
  });

Saída esperada

Resultado final: 1
Ver dica

No primeiro .then(), retorne dividir(resultado, 5) para encadear. O segundo .then() receberá o valor resolvido da segunda divisão.

Mostrar solução
function dividir(a, b) {
  return new Promise((resolve, reject) => {
    if (b === 0) {
      reject(new Error('Divisão por zero'));
    } else {
      resolve(a / b);
    }
  });
}

dividir(10, 2)
  .then(resultado => {
    console.log('Primeiro resultado:', resultado); // 5
    return dividir(resultado, 5); // encadeia a segunda divisão
  })
  .then(resultadoFinal => {
    console.log('Resultado final:', resultadoFinal); // 1
  })
  .catch(erro => {
    console.error('Erro:', erro.message);
  });

Passo a passo

  1. A função dividir recebe dois números e retorna uma Promise.
  2. Dentro da Promise, verificamos se b é zero; se for, chamamos reject com um novo Error.
  3. Caso contrário, chamamos resolve com o resultado da divisão.
  4. Chamamos dividir(10, 2) e encadeamos o primeiro .then().
  5. No primeiro .then(), imprimimos o resultado (5) e retornamos dividir(resultado, 5), que é outra Promise.
  6. O segundo .then() recebe o valor resolvido dessa nova Promise (1) e imprime o resultado final.
  7. O .catch() é anexado ao final da cadeia para capturar qualquer rejeição que ocorra em qualquer etapa.

Por que funciona

O encadeamento de .then() permite que o resultado de uma Promise seja passado para o próximo .then(). Quando retornamos uma nova Promise dentro de um .then(), a cadeia espera que ela seja resolvida antes de continuar. Se qualquer Promise for rejeitada, o fluxo pula para o .catch() mais próximo, ignorando os .then() subsequentes.

Erros comuns

  • Esquecer de retornar a Promise no .then(): se você não usar return dividir(resultado, 5), o próximo .then() receberá undefined em vez do resultado da segunda divisão.
  • Não tratar a rejeição: sem .catch(), uma rejeição gera um UnhandledPromiseRejectionWarning e pode encerrar o processo.
  • Confundir reject com throw: dentro do executor da Promise, você pode usar throw new Error(...), mas é mais idiomático chamar reject.

Outra forma de resolver

Usar async/await com try/catch:

async function calcular() {
  try {
    const r1 = await dividir(10, 2);
    const r2 = await dividir(r1, 5);
    console.log('Resultado final:', r2);
  } catch (erro) {
    console.error('Erro:', erro.message);
  }
}
calcular();

Essa forma é mais legível para cadeias longas, mas o enunciado pede encadeamento com .then().

Saída esperada

Primeiro resultado: 5
Resultado final: 1