Tengo tres observables que me gustaría combinar en una sola transmisión. Sin embargo, el tercer observable requiere una propiedad del primer observable: ¿es posible combinar los tres para evitar suscripciones anidadas (en aras de la claridad)?
Observable.combineLatest(this.fooService.model, this.barService.model) .subscribe(result => { //do work this.bazService.anotherObservable(result[0].someProperty) .subscribe(anotherResult => { //do more work }); });Puedes usar switchMap y map para hacer lo que quieras:
Observable .combineLatest(this.fooService.model, this.barService.model) .switchMap(([foo, bar]) => { return bazService .anotherObservable(foo.someProperty) .map((baz) => [foo, bar, baz]); }) .subscribe(([foo, bar, baz]) => console.log(foo, bar, baz)); Siempre que los observables foo y bar combinados emitan un valor, se llamará al servicio baz y su resultado se combinará aún más.
Tenga en cuenta que switchMap abandonará las llamadas baz pendientes si se vuelven a emitir los observables foo o bar . Si no desea ese comportamiento y siempre desea que se emita el resultado baz , use concatMap en lugar de switchMap .
Otra opción es usar mergeMap en lugar de concatMap ; este último garantizará que se conservará el orden de las llamadas baz , el primero no.