我在" 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对象,但它们都有相同的"价格"对象
对于导致这种情况发生的可观察量,我做错了什么?
答案 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
后结果很好。)