2
respostas

Código Diferente 2 - Com solução

Bom dia Senhores, tudo bem?

Quando eu cheguei nesta parte do curso o código do importaNegociacoes() estava um pouco diferente no meu projeto. Estava assim:

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
             .reduce((arrayAchatado, array) => arrayAchatado.concat(array), [])
                    .forEach(negociacao => this._listaNegociacoes.adiciona(negociacao));
                this._mensagem.texto = "Negociações importadas com sucesso";

            }).catch(error => this._mensagem.erro = error);

    }

A importação ainda funcionava, mas ainda estava duplicando as importações pois o método .some() falhava no primeiro then porque os métodos do service traziam as negociacoes em 3 arrays (um da semana atual, outro da passada e outro da retrasada) e aí era necessário o uso do método "reduce()" para obtermos o array de forma "achatada".

Entretanto, a solução foi apenas passar o "reduce()" para o primeiro "then()" antes de executar o método "filter()". Segue o código corrigido abaixo:

importaNegociacoes() {

        let service = new NegociacaoService();
        service
            .obterNegociacoes()
            .then(negociacoes => 
                negociacoes
                    .reduce((arrayAchatado, array) => arrayAchatado.concat(array), [])
                    .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(error => this._mensagem.erro = error);

    }
2 respostas

Renan, boa tarde!

Ótima solução! Muito obrigado por compartilhar com a gente! Eu vou propor um desafio okay? Olhando o código veja que existem algumas partes que podem ser refatoradas, o que você acha de separar um pouco mais as responsabilidades dessa ação?

Se quiser que sua solução alcance mais alunos não se esqueça de marcar como solucionado

Continue assim e bons estudos!

Boa tarde Felipe!

Fico feliz em ajudar.

Sim, há maneiras de se aprimorar este código.

Uma dessas é passar para a camada de serviços (na classe NegociacaoService) essa responsabilidade de filtrar as negociações (conforme as aulas futuras sugerem) e deixar a camada de controle tratar apenas a adição das negociações na view.

Segue abaixo a solução:

NegociacaoService.js:

importa(listaAtual) {

        return  this
                    .obterNegociacoes()
                    .then(negociacoes =>
                        negociacoes
                            .reduce((arrayAchatado, array) => arrayAchatado.concat(array), [])
                            .filter(negociacao =>
                                !listaAtual.some(negociacaoExistente => negociacao.isEquals(negociacaoExistente)))

                    )
                    .catch(error => {
                        console.error(error);
                        throw new Error("Não foi possível buscar as negociações para importar");
                    });

    }

NegociacaoController.js:

constructor() {
    //Código anterior omitido
    this._service = new NegociacaoService();
}

importaNegociacoes() {

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

    }

Imagino que esteja bem melhor agora