Promise / Observable chaining in IONIC / Angular

0

Personal I am new to IONIC / Angular and I do not understand it yet very well Promise / Observable and would like a help! I have the following situation:

  • User clicks a button that will fetch information from the phone's SQLite;
  • A foreach is made in return and called a WebApi (http post) passing to each record the API;
  • When I finish foreach I will execute 2 commands to delete the SQLite tables;
  • And finally give the user a message
  • But I can not define this sequence, in my code it deletes, gives the message to the user to then call the API for each record. Here is an excerpt of the code

        SincronizarSistema() {
      let loading: Loading = this.showLoading('Sincronizando...');
    
      this.voucherService.sincronizarPedidoDetalheSistema()
    
      this.pedidosDetalhe = [];
      this.pedidosDetalheBase = [];
      this.carregarEventos();
      loading.dismiss();
    
      this.showAlert('Sincronização realizada com sucesso !')}
    
    sincronizarPedidoDetalheSistema() {
     this.getDB().then(() => {
      let listaPedidosDetalhe: PedidoDetalhe[];
    
      this.retornaPedidosDetalheBaixados()
        .then((pedidosDetalhe: PedidoDetalhe[]) => {
    
          listaPedidosDetalhe = pedidosDetalhe
    
          listaPedidosDetalhe.forEach(element => {
            this.baixaPedidoDetalheSistema(element.idPedidoDetalhe)
              .subscribe(pedidoDetalhe => {
                console.log('Pedido ${element.idPedidoDetalhe} baixado com sucesso !')
              }, error => {
                console.log('Erro ao baixar pedido ', error)
              })
          });
    
    
          console.log("chegou aqui")
          this.db.executeSql('DELETE FROM tblPedidoDetalhe', [])
          this.db.executeSql('DELETE FROM tblEventoSincronismo', [])
    
        })
    });}
    
        
    asked by anonymous 04.08.2018 / 01:59

    2 answers

    0

    Friend, good evening.

    try this:

    listaPedidosDetalhe.forEach(element => {
        this.baixaPedidoDetalheSistema(element.idPedidoDetalhe)
          .subscribe(pedidoDetalhe => {
            console.log('Pedido ${element.idPedidoDetalhe} baixado com sucesso !')
            this.db.executeSql('DELETE FROM tblPedidoDetalhe', []);
            this.db.executeSql('DELETE FROM tblEventoSincronismo', [])!');
          }, error => {
            console.log('Erro ao baixar pedido ', error)
          })
      });
    
        
    04.08.2018 / 05:36
    0

    I was able to do it using forkJoin, however I did a test on an emulator by turning off the internet (which in this case would give error for not being able to access the API) and did not fall into catch

     this.voucherService.retornaPedidosDetalheBaixados()
        .then((pedidosDetalhe: PedidoDetalhe[]) => {
          this.pedidosDetalheBaixados = pedidosDetalhe
        })
        .then(() => {
          if (this.pedidosDetalheBaixados.length > 0) {
            const calls = [];
    
            this.pedidosDetalheBaixados.forEach((pedidoDetalhe: PedidoDetalhe) => {
              calls.push(this.voucherService.baixaPedidoDetalheSistema(pedidoDetalhe.idPedidoDetalhe))
            })
            return forkJoin(calls)
              .subscribe((sucess) => {
                this.voucherService.deletaBases();
                this.pedidosDetalhe = [];
                this.pedidosDetalheBase = [];
                this.carregarEventos();
                loading.dismiss();
    
                this.messageService.showToast('Sincronização realizada com sucesso !', '3000', 'bottom').subscribe(toast => { });
              },(erro) =>{
                this.messageService.showAlert('Não foi possível realizar e sincronização com o sistema')
              })
          } else {
            this.voucherService.deletaBases();
            this.pedidosDetalhe = [];
            this.pedidosDetalheBase = [];
            this.carregarEventos();
            loading.dismiss();
    
            this.messageService.showToast('Sincronização realizada com sucesso !', '3000', 'bottom').subscribe(toast => { });;
          }
        })
        .catch(() => {
          this.messageService.showAlert('Não foi possível realizar e sincronização com o sistema')
        })
    
        
    09.08.2018 / 23:31