从多个可观察数据到数据库并向数据库添加一次的处理结果
问题描述:
我需要处理2个不同的API数据结果,通过getData()和getAnotherData()可观察到结果并将结果保存到数据库。 我不喜欢我必须检查两个observable的数据何时处理的方式。你有什么不同的做法吗?从多个可观察数据到数据库并向数据库添加一次的处理结果
import { Observable } from 'rxjs/Rx';
class dataClass {
data: any;
id: string;
constructor (id) {
this.id = id;
this.proccess()
}
proccess() {
let i = 0;
this.getData(this.id).subscribe(
res => {
this.data = {
// process API data
}
},
undefined,
() => this.onLoad(++i)
);
this.getAnotherData(this.id).subscribe(
res => {
this.data.another = {
// process API data
}
},
undefined,
() => this.onLoad(++i)
);
}
getData(id):Observable<any> {
// return JSON API obserable
}
getAnotherData(id):Observable<any> {
// return JSON API obserable
}
onLoad(i) {
if (i == 2) {
// send processed data back to db
firebase.database()
.ref('/test/' + this.channel.id)
.update(this.data, this.onError);
}
return;
}
onError(error) {
if (error) {
console.error('Error: ' + error);
} else {
console.log("Data saved successfully.");
}
}
}
var adm = new dataClass("id");
答
您可以使用forkJoin
简化实施。
forkJoin
需要大量的可观测量,并在所有观测量都完成时发出包含最后发射值的数组。
此外,您可以使用mergeMap
将update
调用返回的承诺组合成可观察流。
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';
import 'rxjs/add/operator/mergeMap';
Observable.forkJoin(
this.getData(this.id),
this.getAnotherData(this.id)
)
.mergeMap(([data, anotherData]) => {
this.data = data;
this.data.another = anotherData;
return firebase
.database()
.ref('/test/' + this.channel.id)
.update(this.data);
})
.subscribe(undefined, this.onError);
+0
Muchos的荣誉! :) – iamart
来自两个观察对象的数据是否以相同的方式处理? – 0mpurdy
@ 0mpurdy不,所以我不得不将它们分开。 – iamart
对不起,我完全误读了这个问题(这里已经晚了)您可以使用[merge](http://reactivex.io/documentation/operators/merge.html)并在合并的observable完成时执行'onLoad'(你会只是无视我认为的合并流)[Rx弹珠](http://rxmarbles.com/#merge)尝试拖动弹珠(包括完整)来看看会发生什么。你在问什么?如果我再次犯错,我最好在发布答案前检查一下! – 0mpurdy