3
respostas

Como garantir a sincronia com Promise.all() ?

Olá. Estou fazendo a importação de negociações como mostrada no capítulo. Na aula o professo diz que o Promise.all() executará as funções na ordem que passei no array. Mas aparentemente isso não está acontecendo quando exibo as mensagens de sucesso no console.

O console exibe:

Obtendo as negociações da semana Obtendo as negociações da semana retrasada Obtendo as negociações da semana anterior

Por que isso acontece?

PS: Na tela os dados são exibidos corretamente.

3 respostas

Fala aó Thiago, tudo bem? Consegue compartilha o código completo? Ficaria mais fácil para tentar lhe ajudar, normalmente era para respeitar as ordens sim.

Espero ter ajudado.

Abaixo o método importa() do controller:

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

        Promise.all([
            service.obterNegociacoesDaSemana(),
            service.obterNegociacoesDaSemanaAnterior(),
            service.obterNegociacoesDaSemanaRetrasada()
        ]).then(negociacoes => {
            console.log(negociacoes);

            negociacoes
                .reduce( (arrayRetorno, array) => arrayRetorno.concat(array), [] )
                .forEach( negociacao => this._listaNegociacoes.adiciona(negociacao));

            this._mensagem.texto = 'Negociações importadas com sucesso';
        }).catch(
            erro => this._mensagem.texto = erro
        );

    }

E a classe NegociacaoService:

class NegociacaoService {

    obterNegociacoesDaSemana() {
        return new Promise( (resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/semana');

            xhr.onreadystatechange = () => {
                if (xhr.readyState == 4) {
                    if (xhr.status == 200) {
                        console.log('Obtendo as negociações da semana');
                        resolve( JSON.parse(xhr.responseText)
                                .map( objeto => new Negociacao(new Date(objeto.data), objeto.quantidade, objeto.valor)));
                    } else {
                        console.log(xhr.responseText);
                        reject('Não foi possível obter as negociações da semana');
                    }
                }
            }

            xhr.send();
        });
    }

    obterNegociacoesDaSemanaAnterior() {
        return new Promise( (resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/anterior');

            xhr.onreadystatechange = () => {
                if (xhr.readyState == 4) {
                    if (xhr.status == 200) {
                        console.log('Obtendo as negociações da semana anterior');
                        resolve( JSON.parse(xhr.responseText)
                                .map( objeto => new Negociacao(new Date(objeto.data), objeto.quantidade, objeto.valor)));
                    } else {
                        console.log(xhr.responseText);
                        reject('Não foi possível obter as negociações da semana anterior');
                    }
                }
            }

            xhr.send();
        });
    }

    obterNegociacoesDaSemanaRetrasada() {
        return new Promise( (resolve, reject) => {
            let xhr = new XMLHttpRequest();
            xhr.open('GET', 'negociacoes/retrasada');

            xhr.onreadystatechange = () => {
                if (xhr.readyState == 4) {
                    if (xhr.status == 200) {
                        console.log('Obtendo as negociações da semana retrasada');
                        resolve( JSON.parse(xhr.responseText)
                                .map( objeto => new Negociacao(new Date(objeto.data), objeto.quantidade, objeto.valor)));
                    } else {
                        console.log(xhr.responseText);
                        reject('Não foi possível obter as negociações da semana retrasada');
                    }
                }
            }

            xhr.send();
        });
    }

}

Fala aí Thaigo, tudo bem? Estranho, era para respeitar sim.

Se quiser compartilha o projeto completo, ai consigo simular o problema e dar uma olhada com mais calma e detalhes por aqui.

Pode subir no Github ou Google Drive (zipado).

Fico no aguardo.