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

Dúvida sobre a questão:

Não entendi a explicação do professor. Caso alguém possa explicar, obrigada.

class HttpService {

    _handleErrors(res) {

        if (!res.ok) {
            throw new Error(res.statusText);
        }

        return res;
    }

    get(url) {

        fetch(url)
            .then(res => this._handleErrors(res))
            .then(res => res.json());
    }

    post(url, dado) {

        fetch(url, { 
            headers: { 'Content-Type': 'application/json' },
            method: 'post',
            body: JSON.stringify(dado)
        })
        .then(res => this._handleErrors(res)); 
    }

}

Contudo, quando os métodos get ou post são chamados, a seguinte mensagem de erro é exibida no console:

Cannot read property 'then' of undefined Tente descobrir primeiro o erro do código e só depois continue para ver a resposta do instrutor.

Veja que os dois métodos esqueceram de retornar uma promise, isso porque a função fetch retorna uma promise. Sem retorná-la, não é possível encadear uma chamada à then.

6 respostas

Fala aí Thauana, tudo bem? O erro Cannot read property 'then' of undefined acontece porque você está tentando chamar a função .then após chamar a função get ou post.

Mas, você esqueceu de retornar uma Promise, pois por padrão a função .then é exclusivo de Promise. Se você não retornar nada na sua função, o retorno será undefined, então você vai estar tentando fazer undefined.then o que não existe.

Ao adicionar o retorno, você vai retornar uma Promise e sendo assim pode usar a função .then.

Espero ter ajudado.

Me desculpe, ainda não entendi. Pensei que o .then já era o retorno da Promise. Como seria o retorno neste exemplo?

Boa tarde, Thauana! Como vai?

Na realidade, no then() vc trata o retorno da Promise! Contudo, tanto no método get() quanto no post() o que se deseja é retornar a própria Promise de modo que quem invocar esses métodos ficará responsável por tratar o retorno da Promise em si!

Sendo assim, para resolver o exercício, tudo que precisa ser feito é retornar a Promise devolvida pelo fetch()!

A grande pergunta agora é: como eu retorno um valor (nesse caso, a Promise do fetch()) a partir de um método?

Pense um pouco aí e veja se mata a charada! Se precisar de alguma ajuda é só falar aqui!

Grande abraço e bons estudos, minha aluna!

Desculpa Thauana, talvez minha explicação não tenha sido muito boa em relação ao retorno e .then.

Mas, com o complemento do Gabriel talvez tenha ficado um pouco mais claro as coisas.

Espero ter ajudado.

Gabriel, tudo bem?

Analisando aqui e respondendo ou tentando responder a charada haha. Seria por meio de uma arrow functions?!

solução!

Opa, Thauana! Tudo ótimo!

Perdão pela demora, mas vamos lá! Nesse caso, não é necessário uma arrow function! Basta fazer um return para retornar a Promise que a fetch() devolve e tudo estará resolvido!

get(url) {

        return fetch(url)
                 .then(res => this._handleErrors(res))
                 .then(res => res.json());
}