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

Exercício 5: Quando da erro está estranho...

A mensagem de erro é exibida somente quando clico duas vezes no botão de importar, poderiam me ajudar a entender o que estou errando?

NegociacaoService

class NegociacaoService {

    constructor() {
        this._http = new HttpService();
    }

    obtemNegociacoesDaSemana() {
        return this._http.get('negociacoes/semasna')
                .then(response =>
                    response.map(objeto =>
                        new Negociacao(new Date(objeto.data), objeto.quantidade, objeto.valor)
                    )
                )
                .catch(erro => {
                    console.log(erro);
                    throw new Error('Não foi possível obter as negociações da semana');
                });
    }

    obtemNegociacoesDaSemanaAnterior() {
        return this._http.get('negociacoes/anterior')
                .then(response =>
                    response.map(objeto =>
                        new Negociacao(new Date(objeto.data), objeto.quantidade, objeto.valor)
                    )
                )
                .catch(erro => {
                    console.log(erro);
                    throw new Error('Não foi possível obter as negociações da semana anterior');
                });
    }

    obtemNegociacoesDaSemanaRetrasada() {
        return this._http.get('negociacoes/retrasada')
                .then(response =>
                    response.map(objeto =>
                        new Negociacao(new Date(objeto.data), objeto.quantidade, objeto.valor)
                    )
                )
                .catch(erro => {
                    console.log(erro);
                    throw new Error('Não foi possível obter as negociações da semana retrasada');
                });
    }

    obtemNegociacoes() {
        return Promise.all([
                this.obtemNegociacoesDaSemana(),
                this.obtemNegociacoesDaSemanaAnterior(),
                this.obtemNegociacoesDaSemanaRetrasada()
            ])
            .then(negociacoes =>
                negociacoes.reduce((atual, novo) => novo.concat(atual), [])
            )
            .catch(erro => {
                console.log(erro);
                throw new Error('Não foi possível obter as negociações');
            });
    }

}

NegociacaoController

class NegociacaoController {

    constructor() {
        let $ = document.querySelector.bind(document);
        this._inputData = $('#data');
        this._inputQuantidade = $('#quantidade');
        this._inputValor = $('#valor');

        this._listaNegociacoes = new Bind(new ListaNegociacoes(), new NegociacaoView($('#negociacoesView')), 'adiciona', 'esvazia');

        this._mensagem = new Bind(new Mensagem(), new MensagemView($('#mensagemView')), 'texto');
    }

    adiciona(event) {
        event.preventDefault();
        this._listaNegociacoes.adiciona(this._criaNegociacao());
        this._limpaFormulario();
        this._mensagem.texto = 'Negociação adicionada com sucesso';
    }

    importaNegociacoes() {
        let service = new NegociacaoService();
        service.obtemNegociacoes()
            .then(negociacoes => {
                negociacoes.forEach(negociacao => this._listaNegociacoes.adiciona(negociacao));
                this._mensagem.texto = 'Negociações obtidas com sucesso';
            })
            .catch(erro => this._mensagem.texto = erro.message);
    }

    apaga() {
        this._listaNegociacoes.esvazia();
        this._mensagem.texto = 'Notificações apagadas com sucesso';
    }

    _criaNegociacao() {
        return new Negociacao(
            DateHelper.textoParaData(this._inputData.value),
            this._inputQuantidade.value,
            this._inputValor.value
        );
    }

    _limpaFormulario() {
        this._inputData.value = '';
        this._inputQuantidade.value = 1;
        this._inputValor.value = 0.0;
        this._inputData.focus();
    }

}
17 respostas

A mensagem de erro exibida é qual? O que esta no console do chrome?

Você quer forçar um erro, é isso?

Oi Camila. Pode lançar uma luz sobre as perguntas que fiz? Quero entender melhor o problema para ajuda-la.

Vi que em seu serviço há o endereço 'negociacoes/semasna'. Você colocou de propósito para dar erro? Foi isso? E o erro só rola na segunda vez?

Desculpe a demora e obrigada pela ajuda.

Isso, coloquei de propósito para dar erro, porém a mensagem de erro só é exibida na segunda vez que clico em importar.

Sem problema. Na Alura, o aluno é quem dita o tempo :)

Deixa eu te peguntar: você esta clicando rapidamente no botão? É porque a requisição demora alguns segundos para ser realizada (isso porque no server eu coloquei demorado de propósito). Clique, espere uns 3 segundos e clique novamente. Se o error persistir, eu vou passar um pente fino no seu código para entender o que esta acontecendo, até porque, fiquei curioso com esse comportamento.

Só para ficar ainda mais claro: qual mensagem é exibida na página e qual mensagem é exibida no console do Chrome?

Flavio aproveitando o codigo, o erro está acontendo comigo também, está dando isso no console do chorme NegociacaoService.js:4 Uncaught ReferenceError: HttpService is not defined a classe do NegociacaoService está a mesma que foi postada..

João, vou te pedir para postar essa duvida em um novo post. Pois é outro problema. Provavelmente importação errada de script.

Aguardo seu post.

Esperei, mas a mensagem ainda não foi é exibida na tela no primeiro clique.

Na segunda vez que clico no botão de importar, ela é exibida na div da NegociacaoView: "Não foi possível obter as negociações".

Este aqui é log do console:

HttpService.js:18 GET http://localhost:3000/negociacoes/semasna 404 (Not Found)
- Promise @ HttpService.js:18
- get @ HttpService.js:4
- obtemNegociacoesDaSemana @ NegociacaoService.js:8
- obtemNegociacoes @NegociacaoService.js:48
- importaNegociacoes @ NegociacaoController.js:27
- onclick @ (index):37
- NegociacaoService.js:15 Cannot GET /negociacoes/semasna

NegociacaoService.js:56 Error: Não foi possível obter as negociações da semana(…)

Oi Camila! Poste o código do HttpService para que eu possa analisar.

Eu vou analisar com carinho essa questão. Como não estou com o projeto agora só mais tarde.

Peço que os moderadores não fechem essa questão até eu descobrir. Curioso esse comportamento.

Testei seu código exatamente como esta e funcionou conforme o esperado aqui. Quando clico a primeira vez, a mensagem de erro é exibida.

Sendo assim, o único código que não olhei seu foi o HttpService. Talvez o problema esteja nele. Ou quem sabe, em MensagemView.

Você alterou o projeto? Vi que mudou alguns nomes de arquivos e métodos, alterou mais alguma coisa? Inclusive o gabarito final do curso funciona perfeitamente.

Oi, iniciei com a primeira versão do projeto disponível para download na explicação da Aula 1, Módulo I.

Adicionei o projeto completo em minha conta do github,para acessá-lo por completo, no repositório fiz push do de um video que gravei com o erro acontecendo, aqui eles :-):

O HttpService está assim:

class HttpService {

    get(url) {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', url);
            xhr.onreadystatechange = () => {
                if (xhr.readyState == 4) {
                    let responseText = xhr.responseText;

                    if (xhr.status == 200) {
                        resolve(JSON.parse(responseText));
                    } else {
                        reject(responseText);
                    }
                }
            };
            xhr.send();
        });
    }

    post(url, dado) {
        return new Promise((resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('POST', url, true);
            xhr.setRequestHeader('Content-type', 'application/json');
            xhr.onreadystatechange = () => {
                if (xhr.readyState == 4) {
                    let responseText = xhr.responseText;

                    if (xhr.status == 200) {
                        resolve(JSON.parse(responseText));
                    } else {
                        reject(responseText);
                    }
                }
            };
            xhr.send(JSON.stringify(dado));
        });
    }

}
solução!

Boa! Estou curioso com seu problema. Olhando o projeto como um todo podr lançar uma luz no seu código.

Relaxe, a gente descobre. Vá se preparando para o módulo 3. Mas transpiler só no módulo 4 :)

Aham!!!!!!!!!!!!!!!!!!! Aeeeeeeeeee! Descobri!

O problema esta na implementação do seu ProxyFactory. :)

O if que verifica a propriedade é que tem o return e não o contrário.

Olha, demorei umas 4 horas para descobrir o problema porque jamais imaginei que pudesse ser problema na sua implementação, até porque, você implementou tudo direitinho.

Aguardo seu retorno.

Era isso mesmo \o/, funcionou, obrigada pela ajuda :-)

Estou animada para os próximos módulos!!

Olá Camila, venho informá-la que o módulo 3 do curso de JavaScript já foi gravado e esta na fase de criação de exercícios. Sendo assim, muito em breve ele será disponibilizado para vocês.

Ele abordará persistência de dados offline com IndexedDB, mostrará as nuâncias de Promises (inspirado nas perguntas que você postou no fórum), ensinará novos padrões de Projeto, Fetch API, transpiler com Babel e ES2015 modules e ainda truques e dicas da linguagem espalhadas pelo projeto.

Sucesso e bom estudo!

Que boa notícia, estou ansiosa para fazer o módulo 3! Obrigada por compartilhar :-)