【问题标题】:Show loading for multiple requests in Ionic 3 and Angular 4在 Ionic 3 和 Angular 4 中显示多个请求的加载
【发布时间】:2018-03-10 15:24:10
【问题描述】:

如何在我的两个请求的整个时间内在屏幕上显示加载?

我试图在两个请求中都加载呼叫专业版。但是当最快的请求最终确定时,它会隐藏加载,即使另一个请求正在进行中。

ionViewDidLoad() {
  this.getSummary(parametros);
  this.getHeatmap(parametros);
}

getSummary() {
  this.loadingService.showLoader(this.constants.MSG_LOADING);

  this.remedyProvider.getSummaryByDate().subscribe(
    (response) => {
     /// do something
    }, (error) => {
      this.showSummary = false;
      console.log(`Backend returned error was: ${error}`);
      this.loadingService.hideLoader();
    }, () => {
      console.log('get heatmap complete');
      this.loadingService.hideLoader();
    }););
}

getHeatmap() {
  this.loadingService.showLoader(this.constants.MSG_LOADING);

  this.remedyProvider.getHeatmap().subscribe(
    (response) => {
        //do something      
    }, (error) => {
      console.log(`Backend returned error was: ${error}`);

    }, () => {
      console.log('get heatmap complete');
      this.loadingService.hideLoader();
    });
}

LoadingProvider(loadginService)的代码:

export class LoadingProvider {

  loader: any = null;
  constructor(private _loadingController: LoadingController) {
  }

  private showLoadingHandler(message) {
      if (this.loader == null) {
          this.loader = this._loadingController.create({
              content: message
          });
          this.loader.present();
      } else {
          this.loader.data.content = message;
      }
  }

  private hideLoadingHandler() {
      if (this.loader != null) {
          this.loader.dismiss();
          this.loader = null;
      }
  }

  public showLoader(message) {
      this.showLoadingHandler(message);
  }

  public hideLoader() {
      this.hideLoadingHandler();
  }
}

【问题讨论】:

    标签: angular typescript ionic2 rxjs ionic3


    【解决方案1】:

    您可以使用ObservableforkJoin 运算符,以便同时发出两个请求,并在两个方法完成时隐藏加载器:

    // Imports...
    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/observable/forkJoin'
    
    // ...
    
      ionViewDidLoad() {
    
        // Show the loader
        this.loadingService.showLoader(this.constants.MSG_LOADING);
    
        Observable.forkJoin([
            this.remedyProvider.getSummaryByDate(),
            this.remedyProvider.getHeatmap()
        ]).subscribe(
            response => {
                let summaryResponse = response[0];
                let heatmapResponse = response[1];
    
                // Do something with the responses...
                // ...
            }, 
            error => {
                // TODO: handle the error!
                console.log(`Backend returned error was: ${error}`);
            },
            () => {
                console.log('Both request are done');
    
                // Hide the loader
                this.loadingService.hideLoader();
            });
      }
    

    【讨论】:

    • 感谢@sebaferreas,但是,如果请求中出现错误怎么办?其他人会怎样?
    • 如果任何单个请求失败@EricoSouza,整个操作将导致错误状态。您需要以不同的方式处理吗?
    • 是的,也许这是另一个问题。但是对于返回错误的请求,我需要在页面上显示成功请求的数据和错误消息。我需要它,连同你的答案。
    猜你喜欢
    • 2018-01-07
    • 2018-01-01
    • 2017-10-18
    • 2023-03-08
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2018-10-07
    • 2019-09-05
    相关资源
    最近更新 更多