作者:mobiledu2502901257 | 来源:互联网 | 2023-02-07 19:01
我试图通过使用来避免嵌套的observable 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]});
,但我不知道如何适应我的例子.
1> Vivek Doshi..:
尝试使用combineLatest
而不是forkJoin
:
用combineLatest
:
const combined = Observable.combineLatest(
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())
)
combined.subscribe(latestValues => {
const [ data_changes , data_all ] = latestValues;
console.log( "data_changes" , data_changes);
console.log( "data_all" , data_all);
});
您也可以通过forkJoin处理它,但forkJoin将在所有调用完成并返回结果时返回数据,但在combineLatest中当任何observable发出值时,从每个调用发出最新值.
用forkJoin
:
const combined = 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())
)
combined.subscribe(latestValues => {
const [ data_changes , data_all ] = latestValues;
console.log( "data_changes" , data_changes);
console.log( "data_all" , data_all);
});
调用两个并检查控制台日志,你会明白的.
您对"combineLatest"行为的描述不正确.在它传递的每个可观测量至少发射一次之前,它不会发出任何东西.并且HTTP observable只会发出一次,所以如何使用它会与使用`forkJoin`不同,如果有的话?