Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merging http observables using forkjoin

I'm trying to avoid nested observables by using forkjoin. The current (nested) version looks like this:

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

I can rewrite the first part as:

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

But i'm not sure how I would then add the .subscribe method to access both data_changes and data_all.

Looking at another example, I know it should look something like .subscribe(res => this.combined = {friends:res[0].friends, customer:res[1]});, but i'm not sure how to adapt this to my example.

like image 268
Martin Avatar asked Apr 02 '17 08:04

Martin


People also ask

How do I use observable forkJoin?

The RxJS forkJoin() operator is a join operator that accepts an Array of ObservableInput or a dictionary Object of ObservableInput and returns an Observableand then waits for the Observables to complete and then combine last values they emitted.

Is forkJoin deprecated?

forkJoin Improvements Moreover, there is one deprecation — forkJoin(a, b, c, d) should no longer be used; Instead, pass an array such as forkJoin([a, b, c, d]) .

What can I use instead of forkJoin?

concat() which will handle each observable in sequence.

What is forkJoin used for?

forkJoin is an operator that takes any number of input observables which can be passed either as an array or a dictionary of input observables. If no input observables are provided (e.g. an empty array is passed), then the resulting stream will complete immediately.


1 Answers

Try to use combineLatest instead of 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); }); 

You can also handle it by forkJoin , but forkJoin will return data when all calls are finished and return result , but in combineLatest When any observable emits a value, emit the latest value from each.

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

Call both and check the console log , you will get idea.

like image 77
Vivek Doshi Avatar answered Oct 06 '22 07:10

Vivek Doshi