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

Problema na comparação de objetos em NegociacaoController

Pessoal, percebi que a implementação do método importarNegociacoes() dentro do trecho de comparação JSON.stringify(negociacao) == JSON.stringify(negociacaoExistente))) estão sendo comparados objetos diferentes.

O que está sendo retornado do método obterNegociacoes() é um conjunto de arrays que correspondem as negociacoes da semana, anterior e retrasada. Com isso, o que está no objeto negociacaoExistente da arrow function de some e o objeto negociacao da arrow function da filter são respectivamente diferentes e consequentemente entrei em uma importação infinita ao entrar no método init:

` Objeto negociacao: [{"data":"2018-11-07T11:05:24.495Z","quantidade":1,"valor":750,"volume":750},{"data":"2018-11-07T11:05:24.495Z","quantidade":2,"valor":950,"volume":1900},{"data":"2018-11-07T11:05:24.495Z","quantidade":3,"valor":950,"volume":2850}]

Objeto negociacaoExistente: {"data":"2018-11-07T11:05:24.495Z","quantidade":1,"valor":750,"volume":750} `

A minha comparação entre JSON.stringify está tentando comparar esses dois aí acima.

A questão que estou em dúvida é se devo alterar o método obterNegociacoes para trazer em um único array todas as negociacoes da semana, anterior e retrasada, ou se tenho que alterar direto no importarNegociacoes

`importaNegociacoes(){

    console.log('Entrei na função importaNegociacoes');

    let service = new NegociacaoService();
    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 do período importadas'
        }))
        .catch(erro => this._mensagem.texto = erro);
}`

Segue também o meu código da funcao obterNegociacoes da classe NegociacaoService

`obterNegociacoes(){

    return Promise.all(
            [this.obterNegociacoesDaSemana(),
            this.obterNegociacoesDaSemanaAnterior(),
            this.obterNegociacoesDaSemanaRetrasada()]
            )
            .then(negociacoes => {
                    negociacoes
                        .reduce((dados, periodo) => dados.concat(periodo), []);
                        return negociacoes;
                    })
            .catch(erro => {
                throw new Error(erro);
            });
    }

}`

3 respostas

ola. não entendi bem, mais não seria interessante vc criar um id para comparar no lugar de comparar um objeto. ficaria mais limpo e mais seguro a comparação. espero ter ajudado.

Pensei nisso também, mas estou seguindo as instruções do Flávio e gostaria de ser fiel ao exemplo dele.

solução!

Pessoal, descobri o problema, no meu método obterN egociacaoes() estava faltando um map que refazia o array para enviar apenas 1.

.map(dado => new Negociacao(new Date(dado.data), dado.quantidade, dado.valor ));

Com isso o problema foi resolvido.

Obrigado!