web-dev-qa-db-fra.com

Fusion des observables http à l'aide de forkjoin

J'essaie d'éviter les observables imbriquées en utilisant forkjoin. La version actuelle (imbriquée) ressemble à ceci:

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

Je peux réécrire la première partie en tant que:

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

Mais je ne sais pas comment j'ajouterais alors la méthode .subscribe Pour accéder à la fois à data_changes Et à data_all.

En regardant un autre exemple, je sais que cela devrait ressembler à quelque chose comme .subscribe(res => this.combined = {friends:res[0].friends, customer:res[1]});, mais je ne sais pas comment l'adapter à mon exemple.

24
Martin

Essayez d’utiliser combineLatest au lieu de forkJoin:

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

Vous pouvez également le gérer avec forkJoin, mais forkJoin renverra les données lorsque tous les appels seront terminés et renverra le résultat, mais dans combineLatest Lorsque tout observable émettra une valeur, émettra la dernière valeur de chacun.

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

Appelez les deux et consultez le journal de la console, vous en aurez une idée.

38
Vivek Doshi