3
respostas

[Dúvida] (r.erro)

erro é algum tipo de paramêtro ?? pois tentei fazer do meu jeito e so retorna um valor quando ultilizo o (erro)!

3 respostas

Depende do jeito que você está fazendo Gabriel. Manda aqui depois pra ver o que você fez. Bora tentar entender o código que a Instrutora fez:

var consultaCep = fetch('https://viacep.com.br/ws/01001000/json/')
    .then(resposta => resposta.json())
    .then(r => {
        if (r.erro) {
            throw Error('Esse cep não existe')
        }
        else {
            console.log(r)
        }
    })
    .catch(erro => console.log(erro));

Primeiro bora entender o que cada método tá retornando: o fetch nos retorna um objeto do tipo promise, esse objeto possui o método then. Esse método possui seus parâmetros, que são ponteiros de funções para resolve e reject. O parâmetro "resposta" será passado em nossa arrow function para a resolve e não estamos usando o reject. Vamos com calma até aqui. A maior dúvida até aqui deve ser de onde surge esse parâmetro "Resposta"? "Resposta" é um parâmetro que nós criamos, mas o seu conteúdo veio do then. Segundo o site developer.mozilla.org

Uma Função chamada de forma assíncrona se a Promessa for cumprida. Essa função possui um parâmetro, o valor de cumprimento. Se não for uma função, ela é substituída internamente por uma função de identidade ((x) => x) que simplesmente passa o valor de cumprimento adiante.

Posso estar equivocado aqui, mas ao que tudo indica, o valor de cumprimento é justamente nossa "Resposta", é o que foi obtido com a promise.

Então, em seguida pegamos nossa resposta e utilizamos o método .json() para obter novamente uma promise. Dessa vez ela nos retorna um objeto diferente. Esse objeto não possui a propriedade erro, somente quando realmente ocorre um erro que essa propriedade surge no objeto da resposta.

Beleza, então se não for erro, a propriedade r.erro não existe, e eu não entro no if, agora se for, eu subo ele com o throw, e a minha função catch irá tratar ele, ou seja, beleza deu erro, mas o que fazer com esse erro? Nesse caso, printar uma mensagem no console.

Espero que tenha ajudado a esclarecer, recomendo dar uma lida nesses sites. Caso ainda tenha alguma dúvida manda ai o código que você fez e a gente tenta entender o que deu errado.

fontes: https://www.geeksforgeeks.org/javascript-fetch-method/ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then https://developer.mozilla.org/en-US/docs/Web/API/Response/json

O meu código está idêntico ao da aula, e o termo 'erro' de dentro do if não é reconhecido, esta é a mensagem que tenho no console, mesmo usando um CEP válido: TypeError: Cannot read properties of undefined (reading 'erro')

Eu realmente achei estranho que o highlite não marcou o r.erro. Só pra garantir que está idêntico, aí vai o Ctrl + v:

const consultaCEP = fetch('https://viacep.com.br/ws/01001000/json/')
    .then(resposta => resposta.json())
    .then(r => {
        if(r.erro){
            throw Error("Este CEP não existe!")
        }else{
            console.log(r)
        }
    }).catch(erro => console.log(erro));

console.log(consultaCEP);

O erro não reconhecido é justamente o que está dentro do if. Achei estranho, fiz umas alterações meio no chutômetro, mas sem sucesso.

Encontrei meu equívoco. Eu estava "forçando errado o erro". Testando 7 dígitos no CEP, o retorno da API é um 400. Por isso minha mensagem customizada não aparecia. Aqui foi onde respondi, narrando minha epifania: https://cursos.alura.com.br/forum/topico-duvida-catch-esta-sobrepondo-o-if-do-erro-267252