webentwicklung-frage-antwort-db.com.de

Zusammenführen von http-Observablen mit forkjoin

Ich versuche, verschachtelte Observablen mit forkjoin zu vermeiden. Die aktuelle (verschachtelte) Version sieht folgendermaßen aus:

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

Ich kann den ersten Teil umschreiben als:

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())
)

Ich bin mir jedoch nicht sicher, wie ich dann die Methode .subscribe Hinzufügen würde, um auf data_changes Und data_all Zuzugreifen.

Wenn ich mir ein anderes Beispiel ansehe, sollte es ungefähr so ​​aussehen wie .subscribe(res => this.combined = {friends:res[0].friends, customer:res[1]});, aber ich bin mir nicht sicher, wie ich es an mein Beispiel anpassen soll.

24
Martin

Versuchen Sie, combineLatest anstelle von forkJoin zu verwenden:

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

Sie können dies auch mit forkJoin erledigen, aber forkJoin gibt Daten zurück, wenn alle Aufrufe abgeschlossen sind, und gibt das Ergebnis zurück.

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

Rufen Sie beide an und überprüfen Sie das Konsolenprotokoll.

38
Vivek Doshi