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

erro na hora de importar automaticamente as negociações

minha página está funcionando bem, porém no momento em que as negociações são trazidas do servidor acontece um erro

ReferenceError: negociacao is not defined

consegui rastrear o erro até o filtro criado para que as negociações não sejam adicionadas repetidas vezes

this._service
        .obterNegociacoes()
        .then(negociacoes => negociacoes.filter(negociacao => 
            !this._listaNegociacoes.negociacoes.some(negociacaoExistente => 
              negociacao.isEqual(negociacaoExistente)
            )))
        .then(negociacoes => negociacoes.forEach(negociacao => {
          this._listaNegociacoes.adiciona(negociacao)
          this._mensagem.texto = "Negociações importadas com sucesso."
        }))
        .catch(erro => this._mensagem.texto = erro +" ou aqui");

aparentemente o erro está na função "filter" mas não consegui achar uma maneira de resolver. baixei o projeto completo para comparar com meu código, mas vi que nele essa funcionalidade não está sendo usada.

this._service
            .importa(this._listaNegociacoes.negociacoes)
            .then(negociacoes => negociacoes.forEach(negociacao => {
                this._listaNegociacoes.adiciona(negociacao);
                this._mensagem.texto = 'Negociações do período importadas'   
            }))
            .catch(erro => this._mensagem.texto = erro);                              
    }

existe uma solução para o caso ou é melhor remover a funcionalidade?

9 respostas

Oi Victor, esse filtro não me parece problemático. Você acha que o erro é nessa linha por que? Se você remover, funciona?

sim, se o filtro for removido a aplicação funciona, eu identifiquei que o erro era nesse trecho pois o erro logado era o desse .catch, aí fui testando con console.log() para tentar achar exatamente o local, e foi no filtro, na primeira chamada ele funciona bem, busca as negociações e coloca na tabela. Porém se já existir alguma negociação que seja ele não filtra, e não retorna nada

Compartilhe seu projeto no github. Olhando apenas o trecho não dá para saber. Como Wanderson disse, o erro não parece ser no filtro, a consequência do erro deve estar antes na stacktrace. Aliás, nem compartilhar a stacktrace você compartilhou. Ela é importante não só no fórum da Alura, mas em qualquer fórum quando pedimos ajuda.

Outra coisa, não sei onde você esta até agora no exercício. Eu começo mostrando o filtro direto no controller e depois eu movo o filtro para dentro da classe de serviço. Você parece estar na primeira parte, aquela que faz o fintro direto no controller e depois move a lógica para dentro do serviço.

Pode ficar tranquilo que vamos descobrir.

enviei o meu projeto para o github, segue o link. https://github.com/VChastinet/AluraFrame_curso_javascript consegui resolver o problema usando JSON.stringify nos objetos dentro do filtro, mas usando .isEqual não consegui fazer funcionar de maneira alguma

this._service
        .obterNegociacoes()
        .then(negociacoes => negociacoes.filter(negociacao => 
            !this._listaNegociacoes.negociacoes.some(negociacaoExistente =>
               JSON.stringify(negociacao) == JSON.stringify(negociacaoExistente)
            )))
        .then(negociacoes => negociacoes.forEach(negociacao => {
          this._listaNegociacoes.adiciona(negociacao)
          this._mensagem.texto = "Negociações importadas com sucesso."
        }))
        .catch(erro => this._mensagem.texto = erro);

Se eu baixo o projeto aqui, e colo o seu código funciona perfeito. Por isso o problema não está no código que você postou, vem antes. Você precisa revisar sua classe de serviço. Eu ainda chuto que a stacktrace esta exibindo essa mensagem não é para o controller, mas para alguém acima da pilha. Por isso nem eu nem o Wanderson detectamos problema no seu código.

solução!

Você não conseguiu por este motivo. Veja como esta o seu método isEquals:


  isEqual(criterio){
    return JSON.stringify(negociacao) == JSON.stringify(criterio)
  }

Não existe negociacao dentro de isEquals.

A implementação correta do método é


  isEqual(criterio){
    return JSON.stringify(this) == JSON.stringify(criterio)
  }

Lembre-se que this é a instância da classe que esta chamando o método no momento. Mistério resolvido.

Aliás, parabéns por estar chegando ao final da saga dos cursos de JavaScript avançado!

Sucesso e bom estudo meu aluno!

estou revisando agora o momento em que o filtro é colocado na classe de serviços. Por algum motivo eu não fiz a passagem do filtro para dentro da classe (lapso meu), estou resolvendo isso neste momento.

exatamente lá, outro lapso na hora de dar aquele "copia e cola" no filtro para o método, não troquei o "negociacao" por "this". Está tudo funcionando perfeitamente.

Eu que parabenizo o senhor pelo ótimo conteúdo. Facilitou muito meu aprendizado do javascript, estou ansioso para seus próximos cursos.

Obrigado novamente!

Não se culpe pelo lapso, eu tenho lapso todo dia :)

Sucesso e bom estudo meu aluno!