【问题标题】:How to know when all Angular2 HTTP calls are finished如何知道所有 Angular2 HTTP 调用何时完成
【发布时间】:2016-03-15 14:45:45
【问题描述】:

我正在编写一个应用程序,它将监控我们跨不同服务器的所有应用程序的当前内部版本号。这是通过向每个应用程序中的 txt 文件发出 http 请求来完成的。我正在使用 foreach 循环来做到这一点。

我遇到的问题是我不确定如何(使用 Observables)知道所有请求何时完成。

当请求返回时,我将响应添加为对象数组的属性。然后,一旦我拥有所有数据,我将它绑定到组件的模板,在那里它被管道过滤。因此,我需要确保在所有数据都完成下降之前不绑定它。

这是我获取数据的方式:

this.apps.forEach(app => {
  app.Environments.forEach(env => {
    this._buildMonitorService.getBuilds(env.URL)
      .subscribe((data) => {     
        setupBuilds(this.apps,data.url,data._body);
      });                
  });
});

setupBuilds 将响应添加到我的应用程序数组中。

我正在寻找的东西实际上是一个 Promise.all 我将在其中绑定 this.buildssetupBuilds 中的数据设置,但我不知道如何使用 rxjs observables 来做到这一点

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    Observable.forkJoin 等价于 Promise.all,但用于可观察对象。

    这是一个示例:

    以下是重构代码的方法:

    var observables = [];
    this.apps.forEach(app => {
      app.Environments.forEach(env => {
        observables.push(this._buildMonitorService.getBuilds(env.URL));
      });
    });
    
    Observable.forkJoin(observables).subscribe(
      (result) => {
        result.forEach((data) => {
          setupBuilds(this.apps,data.url,data._body);
        });
      }
    );
    

    这样你就可以确保所有请求都在订阅方法中注册的回调被调用时被执行...

    【讨论】:

    • 所以,我尝试设置它(首先是我自己的方式,然后再次使用您编辑的代码),我得到了Observable_1.Observable.forkJoin is not a function
    • 我确实认为你的答案将是我正在寻找的,但它并不完全有效
    • 你需要导入操作符:import 'rxjs/add/operator/forkJoin'; 或者 import all from rxjs import 'rxjs/Rx';
    • 我已经在import {Observable} from 'rxjs/Observable';
    • 是的,但它只在Observable 类上导入最小的一组方法。试试这个:import {Observable} from 'rxjs/Rx'; 拥有所有(或一一导入运算符)...
    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多