Angular中嵌套订阅的错误

时间:2017-05-17 15:08:13

标签: javascript angular typescript rxjs observable

我在" subscribe"中尝试嵌套订阅因为一些数据取决于先前订阅的响应。 (数据沿订阅链向下流动,直到存储在数组中)

我有一个ID数组,我调用一个服务将这些ID转换为Objects。 代码如下所示:

idArray.forEach(id =>
     this.getObjByID(id)));
}

getOjByID(ID: number): void {
  this._APIService.getObjByID(ID).subscribe(
    obj => {
        this.getDefaultConfig(obj);
    });
}

然后传递这些对象以获取Obj的配置文件。 代码如下所示:

  getDefaultConfig(obj: any): void {
      this._APIService.getDefaultConfig(obj.id).subscribe(
          res => {
              obj.config = res;
              this.getPrices(obj);
          });
  }

最后,此对象将其配置传递给最终订阅,其中将price对象附加到对象,然后将对象推送到对象数组(然后在屏幕上呈现。)代码看起来像这样:

  getPrices(obj: any): void {
      this._PriceService.getPrice(obj).subscribe(
          res => {
              obj.price = res;
              this.objs.push(obj);
          });
  }

我不太了解订阅/观察能力,足以了解我遇到的这个错误的原因。基本上,我使用subscribe来提取响应的值。预期的行为是这个链的运行次数与我在idArray中的id数一样多,但是,似乎有些订阅(或函数)正在再次运行。我在控制台中没有错误,我唯一的指标是最终数组中的项目数" objs"。

我尝试添加" .first()"或" .take(1)"之前" .subscribe"在我的所有函数上,这似乎在我的objs数组中有固定的重复obj对象,但它们都有相同的"价格"对象

对于导致这种情况发生的可观察量,我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的问题可能是由多次订阅同一Observable的奇怪预期行为引起的。当我通过我的服务缓存API响应时遇到了这个问题。

这个想法是,当你第二次订阅一个observable时,会再次检索这个值(它" sa" hot" observable),所以第一个订阅也会收到新的(或相同的) )值,因此你的下一层函数被调用两次(或更多,取决于有多少订阅者)。

您可以通过将.share()添加到您的观察点的末尾来轻松解决此问题,无论它在何处创建。例如,这是我当前项目中的代码片段:

const resp = this.http.get(url)
  .map( /* Some stuff is done and a value is returned */ )
  .catch(this.handleError)
  .share();

return resp;

真正帮助它点击我的一个很好的解释是: https://blog.thoughtram.io/angular/2016/06/16/cold-vs-hot-observables.html

您已经提到此更改导致您的结束对象为空。我不确定这是否是由代码中的某些问题引起的。我会保留此解决方案,因为它适用于您的情况。

(我正在做同样的事情 - 正好三个级别的订阅 - 但在我的案例中添加.share后结果很好。)