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
dividirdeve retornar uma Promise. - Se
b === 0, a Promise deve ser rejeitada com a mensagem'Divisão por zero'. - O encadeamento deve calcular
(10 / 2) / 5usando 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
- A função
dividirrecebe dois números e retorna uma Promise. - Dentro da Promise, verificamos se
bé zero; se for, chamamosrejectcom um novoError. - Caso contrário, chamamos
resolvecom o resultado da divisão. - Chamamos
dividir(10, 2)e encadeamos o primeiro.then(). - No primeiro
.then(), imprimimos o resultado (5) e retornamosdividir(resultado, 5), que é outra Promise. - O segundo
.then()recebe o valor resolvido dessa nova Promise (1) e imprime o resultado final. - 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 usarreturn dividir(resultado, 5), o próximo.then()receberáundefinedem vez do resultado da segunda divisão. - Não tratar a rejeição: sem
.catch(), uma rejeição gera umUnhandledPromiseRejectionWarninge pode encerrar o processo. - Confundir
rejectcomthrow: dentro do executor da Promise, você pode usarthrow new Error(...), mas é mais idiomático chamarreject.
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