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?
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?
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 then
tanto 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.