web-dev-qa-db-ja.com

forkjoinを使用してHTTPオブザーバブルをマージする

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]});のように見えるはずですが、これを自分の例に合わせる方法がわかりません。

24
Martin

combineLatestの代わりにforkJoinを使用してみてください:

with 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はすべての呼び出しが終了するとデータを返し、結果を返します。

with 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);
});

両方を呼び出してコンソールログを確認すると、アイデアが得られます。

38
Vivek Doshi