Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] throw, map e then

O código obtido ao final da aula é o seguinte:

async function buscaEndereco(cep) {
    try {
        let consultaCEP = await fetch(`https://viacep.com.br/ws/${cep}/json/`)
        let consultaCEPConvertida = await consultaCEP.json();
        if(consultaCEPConvertida.erro) {
            throw Error('Esse CEP não existe');
        }
    console.log(consultaCEPConvertida);
    return consultaCEPConvertida;

    } catch(erro) {
        console.log(erro);
    }
}

let ceps = ['01001000', '01001001'];
let conjuntoCeps = ceps.map(valores => buscaEndereco(valores));
console.log(conjuntoCeps);
Promise.all(conjuntoCeps).then(respostas => console.log(respostas));

As dúvidas que me ocorram, foram as seguintes: Primeiro, sobre o bloco da função try. Porque o if que executa o throw Error deve estar em try e não em catch? E quando fazemos consultaCEPConvertida.erro o que estamos fazendo realmente?

Agora, sobre Promise.all e .then(): Se Promise.all retorna uma única promise quando todas as promises já estiverem resolvidas porque usamos .then em seguida?

3 respostas
solução!

Olá, Fernando! Vou tentar esclarecer suas dúvidas sobre o código.

Primeiro, sobre o bloco da função try e catch:

O try e catch são usados para tratar erros em JavaScript. O bloco try contém o código que pode potencialmente lançar um erro. Quando um erro é lançado, a execução do bloco try é interrompida e o controle é passado para o bloco catch.

No seu código, o if que executa o throw Error está dentro do try porque é aí que o erro pode ocorrer. Se consultaCEPConvertida.erro for verdadeiro (ou seja, se a API retornar um erro), então o erro é lançado com throw Error('Esse CEP não existe'). O catch é onde esse erro é tratado, neste caso, apenas imprimindo o erro no console.

Quando você faz consultaCEPConvertida.erro, você está verificando se a resposta da API contém uma propriedade erro. Se a API retornar um erro, essa propriedade será verdadeira.

Agora, sobre Promise.all e .then():

O Promise.all é usado quando você tem várias promessas e quer esperar que todas elas sejam resolvidas antes de continuar. Ele retorna uma nova promessa que é resolvida quando todas as promessas passadas para ele são resolvidas.

A razão pela qual você usa .then após Promise.all é porque Promise.all retorna uma promessa. O método .then é usado para especificar o que deve acontecer quando essa promessa é resolvida. No seu código, quando todas as promessas passadas para Promise.all são resolvidas, a função dentro de .then é chamada, que imprime as respostas no console.

Espero que isso esclareça suas dúvidas! Se você tiver mais perguntas, não hesite em perguntar. Espero ter ajudado e bons estudos!

Bom dia. Temos que imaginar o seguinte. Todo o bloco que queremos executar deve estar no try.

**1- Porque o if que executa o throw Error deve estar em try e não em catch? **

O catch só será executado quando houver algum erro/exceção lançada. No exemplo acima, você esta fazendo uma requisição e caso a consulta traga o atributo erro dentro da resposta, uma exceção deve ser lançada. Esta exceção será lançada para o catch()

2- E quando fazemos consultaCEPConvertida.erro o que estamos fazendo realmente?

consultaCEPConvertida é uma váriavel que esta armazendo o objeto da resposta da requisição. Você esta acessando o atributo erro do objeto consultaCEPConvertida Quando tiver dentra condicional, vc esta checando se existe determinado atributo. (caso exista será considerado Truthy, caso não exista será considerado Falsy).

3- Agora, sobre Promise.all e .then(): Se Promise.all retorna uma única promise quando todas as promises já estiverem resolvidas porque usamos .then em seguida?

Usamos o then para tratar os dados quando a promise for resolvida.

Pessoal, obrigado pelos esclarecimentos!