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

Importa os que não deram erro

Seguindo o que foi passado na aula, quando forçamos um erro, nenhuma negociação é importada, independente de qual requisição possui o erro.

Como eu faria para importar os que não deram erro e exibir a msg de erro dos que realmente retornaram erro?

2 respostas
solução!

Olá Olivan, tudo bem com você?

Neste caso ao invés do Promise.All podemos utilizar o Promise.allSettled, a diferença é que ele executa todas as promises, dando elas certas, ou não, e nos devolve um objeto da seguinte maneira:

[
    { status: "fullfiled", value: "...",
    { status: "rejected", reason: "...",
]

Neste exemplo, temos 1 promise que deu certo e outra que deu errado, desta forma, irei fazer um código beeeeem resumido do que poderíamos fazer:

Promise.allSettled([
                this.obterNegociacoesDaSemana(),
                this.obterNegociacoesDaSemanaAnterior(),
                this.obterNegociacoesDaSemanaRetrasada()
            ]).then(periodos => {
                let erros = periodos.filter(negociacao => negociacao.status !== "fulfilled").map(p => p.reason)
                let negociacoes = periodos
                    .filter( negociacao => negociacao.status === "fulfilled")
                    .map( p => p.value)
                    .reduce((dados, periodo) => dados.concat(periodo), [])
                    .map(dado => new Negociacao(new Date(dado.data), dado.quantidade, dado.valor ));

                resolve([negociacoes, erros])
            })

A diferença é que temos que adicionar um filter para pegar as negociações que deram certo, e um map para pegar os valores delas

O mesmo acontece para os erros, pegamos os diferentes de completados e extraímos a razão

Além disso ao invés de retornar com o resolve(negociacoes), estou retornando um array com 2 posições para utilizar no NegociacaoController, onde a primeira terá o array com todas negociações que deram sucesso, e o segundo um array com as mensagens de erro:

    importaNegociacoes() {


        let service = new NegociacaoService();
        service
            .obterNegociacoes()
            .then(negociacoes => {
                const [sucessos, erros] = negociacoes
                sucessos.forEach(negociacao => {
                    this._listaNegociacoes.adiciona(negociacao);
                    this._mensagem.texto = 'Negociações do período importadas'   
                })

                if(erros.length > 0){
                    this._mensagem.texto = erros.reduce( (err, next) => `${err + next} <br>`, "");
                }
            })

    }

Aqui eu utilizei o destructuring para separar cada posição que está sendo retornado pela nossa Promise em uma variável diferente, dessa forma executamos no thentanto o código positivo ( incluir as negociações), quanto o negativo que seria colocar a mensagem.

Com essa abordagem, não conseguir capturar uma negociação para de ser um erro tratado pelo catch e vira apenas uma mensagem que vamos levando adiante!

Obviamente que esse código podia ser refatorado, para ficar um pouco mais simples, mas apenas para entender a ideia seria algo nessa linha de raciocínio =D

Conseguiu Compreender?

Abraços e Bons Estudos!

Entendi.

Mt obrigado pelo esclarecimento.

Vou pesquisar mais sobre Promise e os métodos existentes.