forkjoin - que es un observable en angular
Fusionando http observables usando forkjoin (1)
Estoy tratando de evitar observables anidados usando forkjoin
. La versión actual (anidada) se ve así:
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();
});
});
}
Puedo reescribir la primera parte como:
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())
)
Pero no estoy seguro de cómo agregaría el método .subscribe
para acceder tanto a data_changes
como a data_all
.
Mirando otro ejemplo, sé que debería parecerse a .subscribe(res => this.combined = {friends:res[0].friends, customer:res[1]});
, pero no estoy seguro de cómo adaptar esto a mi ejemplo.
Intente utilizar combineLatest
lugar de forkJoin
:
Con 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);
});
También puede manejarlo mediante forkJoin, pero forkJoin devolverá los datos cuando todas las llamadas hayan finalizado y devuelva el resultado, pero en combineLatest Cuando cualquier elemento observable emita un valor, emitirá el último valor de cada uno.
Con 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);
});
Llame a ambos y revise el registro de la consola, obtendrá una idea.