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

Acesso a dados de forma síncrona

Estou realizando algumas buscas no servidor, mas elas dependem de dados prévios, que também são realizados através de uma chamada ao servidor, entretanto como a chamada é assíncrona, as vezes ela falha, já que realiza a segunda chamada antes da primeira. Isso também acontece quando utilizo o storage do ionic. Qual seria a melhor forma de fazer essas chamadas quando possuo alguma dependência? existe alguma forma de fazer isso de forma síncrona?

3 respostas

Uma das formas de resolver isso seria usando Promises. Com ela você poderia executar a primeira chamada, e quando ela terminar, mandar executar a segunda. As Promises não são algo exclusivo do Ionic, elas vem do Javscript. Aqui tem uma explicação

https://braziljs.org/blog/promises-no-javascript/

https://tableless.com.br/fluxo-de-execucao-assincrono-em-javascript-promises/

Aqui tem alguns exemplos em Ionic

https://ionicacademy.com/http-calls-ionic/

https://codecraft.tv/courses/angular/http/http-with-promises/

https://imasters.com.br/desenvolvimento/ionic-3-e-angular-5-criando-app-com-pesquisa-e-ordenacao-de-dados
solução!

Boa tarde, Maurício! Como vai, meu aluno?

Durante a parte 1 do curso de Ionic 3 eu mostro nessa aula a solução desse problema! Basicamente vc precisa utilizar a função mergeMap() do RxJS para fazer a segunda requisição apenas após a primeira terminar.

Lembrando que no que diz respeito a desenvolvimento Angular 2+ e Ionic e situações assíncronas, como no seu exemplo, a boa prática é utilizar a solução dada pelo próprio framework, ou seja, o RxJS, em vez de utilizar Promise.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos!

acho que a minha abordagem não esta sendo a ideal, o problema é o seguinte, o servidor que estou usando não aceita requisição em massa, ou seja, para criar um pedido no servidor eu tenho que fazer algo +- assim:

for (let i = 0; i < this.pedidos; i++) { 
 this.PedidoServiceProvider.create(this.pedidos[i].toJson()).subscribe((pedido) => {

        }
}

faço alguns outros processamentos e no final

this.PedidoServiceProvider.list(conta).subscribe((pedidos) => {
this.pedidos = pedidos

        }

so que as vezes ele acaba chamando a busca dos pedidos antes do fim do loop de criação, e sobrescreve minha variável de pedidos, apagando pedidos que ainda não tinham sido sincronizados :(