Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvidas sobre o Promise.all

Não estou entendo muito bem o retorno do Promise.all, foi dito que ele retorna uma Promise, mas sendo a combinação das outras. Aí é que entra minha dúvida, se ela é uma promise, qual seria se resolve e seu reject?

Fiquei tentando entender esse retorno, vê se eu entendi certo. O Promise.all vai realizar todos os 3 métodos passados, dando certo, o resolve vai ser o return do then, dando erro, o reject vai ser o new Error que eu lancei no catch. Resumindo, se o método tiver retorno, entra no then, se foi lançado um erro, entra no catch, é isso?

Fiquei com essa dúvida por conta do then e catch no Controller.

Código do Controller:

importarNegociacoes() {
        let service = new NegociacaoService();

        service.obterNegociacoesPeriodo()
                .then(negociacoes => {
                    negociacoes.forEach(negociacao =>
                        this._listaNegociacoes.adiciona(negociacao))
                        this._mensagem.texto = 'Negociações do período importadas com sucesso!'
                })
                .catch(error => this._mensagem.texto = error);

Código do Service:

class NegociacaoService {

    constructor(){
        this._http = new HttpService();
    }

    obterNegociacoesDaSemana() {
        return this._obterNegociacoes('negociacoes/semana', 'Não foi possível obter as negociações da semana!');
    }

    obterNegociacoesDaSemanaAnterior() {
        return this._obterNegociacoes('negociacoes/anterior', 'Não foi possível obter as negociações da semana anterior!');
    }

    obterNegociacoesDaSemanaRetrasada() {
        return this._obterNegociacoes('negociacoes/retrasadas', 'Não foi possível obter as negociações da semana retrasada!');
    }

    _obterNegociacoes(url, erroMsgm) {
        return new Promise((resolve, reject) => {
            this._http
                .get(url)
                .then(negociacoes => {
                         resolve(negociacoes.map(objeto => new Negociacao(new Date(objeto.data), objeto.quantidade, objeto.valor)))

                })
                .catch(erro => {
                    console.log(erro);
                    reject(erroMsgm);
                });
        });
    }

    obterNegociacoesPeriodo() {

        return Promise.all([this.obterNegociacoesDaSemana(),
                        this.obterNegociacoesDaSemanaAnterior(),
                        this.obterNegociacoesDaSemanaRetrasada()])
                            .then(periodos => {
                                let negociacoes = periodos
                                    .reduce((arrayAchatado, array) => arrayAchatado.concat(array), []);
                                return negociacoes;
                            })
                            .catch(erro => {
                                throw new Error(erro);
                            });
    }
}
1 resposta
solução!

". Resumindo, se o método tiver retorno, entra no then, se foi lançado um erro, entra no catch, é isso?"

É isso!

Promise.all resolve um array de promises. No seu then, você recebe como resposta um array no qual cada elemento é o resultado das promises que foram resolvidas.

Promise
    .all([promise1, promise2, promise3])
    .then(resultados => {
            console.log( resultados[0] );// é o resultado de promise1
            console.log(resultados[1]); // é  o resultado promise2
            console.log( resultados[2]); // é  o resultado de promise3
       })
      .catch(err => {
            // se uma das Promises for rejeitada, trata a rejeição das promises em um único lugar.
     });

No caso do catch, você pode tratar e lançar uma nova exceção se assim desejar. Ou se quiser, não faz catch nenhum e quem chamar o método que retorna a Promise faz.

No módulo 3 do curso do JavaScript avançando, deixo mais evidente detalhes sutis no uso de Promises.