Estoy tratando de aplanar un Observable anidado, pero no consigo que funcione:
this.af.object('test/father') .map(res => { res.namedKeys = []; for (let el in res.keys) { res.namedKeys.push(this.af.object(`test/keys/${el}`)) } return res }) .flatMap(res => Observable.combineLatest(res)) .subscribe(res => { console.log('The final response:', res); });Quiero obtener los datos reales de los Observables en mi matriz. Probé muchas cosas diferentes en los últimos 2 días, pero al final, no recibo nada o sigo recibiendo el Array con Observables. El código anterior no devuelve nada.
Es bastante difícil ver cuál es el problema, ya que no proporciona ninguna información de estructura.
Creo que quieres decir:
for (let el in Object.keys(res))en vez de
for (let el in res.keys) Además, combineLatest espera un observable. no proporcionaste uno:
Considere usar esto en su lugar:
.flatMap(res => Rx.Observable.combineLatest(Rx.Observable.of(res))) Demostración (que usa rxjs 5 que usa switchmap en lugar de flatMap)
http://jsbin.com/cuvisecipi/1/edit?html,js,consola,salida
Una mejor demostración que ilustra una solución similar (de una matriz):
El operador .combineLatest funcionaría pero espera una matriz de Observables. Le está pasando un objeto res que contiene una propiedad con una matriz de Observables.
En otras palabras, .combineLatest necesita esto: Observable[]
Pero lo estás pasando: { namedKeys: Observable[] }
Entonces, su problema no es simplemente aplanar los Observables (como este, por ejemplo, combinar múltiples matrices observables en una nueva matriz de objetos ) porque también necesita pasar los objetos originales. Recomiendo usar forkJoin porque recopila todos los elementos de todos los Observables de origen hasta que se completan.
this.af.object('test/father') .concatMap(res => { // the original object is here as well at index 0 observables = [ Observable.of(res) ]; for (let el in res.keys) { observables.push(this.af.object(`test/keys/${el}`)) } return Observable.forkJoin(observables); }) .map(([res, ...namedKeys]) => { res.namedKeys = namedKeys; return res; }) .subscribe(res => { ... });