我正在尝试使用forkjoin
来避免嵌套的可观察对象。当前(嵌套)版本如下:
this.http.get('https://testdb1.firebaseio.com/.json').map(res => res.json()).subscribe(data_changes => {
this.http.get('https://testdb2.firebaseio.com/.json').map(res => res.json()).subscribe(data_all => {
/* Do this once resolved */
this.platform.ready().then(() => {
this.storage.set('data_changes', data_changes);
this.storage.set('data_all', data_all);
document.getElementById("chart").innerHTML = "";
this.createChart();
});
});
},
err => {
this.platform.ready().then(() => {
console.log("server error 2");
document.getElementById("chart").innerHTML = "";
this.createChart();
});
});
}
我可以将第一部分改写为:
Observable.forkJoin(
this.http.get('https://testdb1.firebaseio.com/.json').map((res: Response) => res.json()),
this.http.get('https://testdb2.firebaseio.com/.json').map((res: Response) => res.json())
)
但我不确定如何添加.subscribe
方法来同时访问data_changes
和data_all
。
看另一个例子,我知道它应该长这样.subscribe(res => this.combined = {friends:res[0].friends, customer:res[1]});
,但我不确定如何将其适应到我的例子中。
combineLatest
的解释,那么这将是一个更好的答案。 - cartantcombineLatest
行为的描述是不正确的。它不会发出任何内容,直到它传递的每个可观测对象至少发出一次。而 HTTP 可观测对象只会发出一次,那么使用它与使用forkJoin
有什么区别呢? - cartantforkJoin
只会在调用forkJoin
后观察到新值时触发,因此如果其中一个可观察对象已经返回了一个值,则forkJoin
将永远不会触发下一个。即使可观察对象已经发出了它的值,combineLatest
也会触发。如果有人遇到订阅 next 函数从未被调用的情况,这可能会对他们有所帮助。 - Chris Putnam