2017-07-26 52 views
0

我需要处理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"); 
+0

来自两个观察对象的数据是否以相同的方式处理? – 0mpurdy

+0

@ 0mpurdy不,所以我不得不将它们分开。 – iamart

+0

对不起,我完全误读了这个问题(这里已经晚了)您可以使用[merge](http://reactivex.io/documentation/operators/merge.html)并在合并的observable完成时执行'onLoad'(你会只是无视我认为的合并流)[Rx弹珠](http://rxmarbles.com/#merge)尝试拖动弹珠(包括完整)来看看会发生什么。你在问什么?如果我再次犯错,我最好在发布答案前检查一下! – 0mpurdy

回答

4

您可以使用forkJoin简化实施。

forkJoin需要大量的可观测量,并在所有观测量都完成时发出包含最后发射值的数组。

此外,您可以使用mergeMapupdate调用返回的承诺组合成可观察流。

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

相关问题