Tengo un método llamado getTransactionDetails(id:string), y devuelve un objeto Observable of TransactionDetails
getTransactionDetails(id:string):Observable<TransactionDetails>El objeto TransactionDetails se ve así:
class TranscationDetails{ id:string; accessCode: string; veggiesList: Array<Veggie>; meatList: Array<Meat>; }El objeto Veggie se ve así:
class Veggie{ id: string; name: string; }Tengo otro método llamado getVeggieSummary(veggieId: string), y devuelve un Observable de VeggieSummary:
getVeggieSummary(veggiesId:string):Observable<VeggieSummary>VeggieSummary se ve así
class VeggieSummary{ id:string; name:string; color:string; kind:string; }Me gustaría llamar a getTransactionDetails(1) y transformar todos los elementos Veggies en veggiesList para que sean VeggieSummary y devuelvan una matriz VeggieSummary.
Esto es lo que tengo
getTransactionDetails(1) .flatMap(transactionDetails=> transactionDetails.veggiesList .map(veggie=>getVeggieSummary(veggie.id))) .subscribe(result=> console.log(result) ) Actualmente, el result es un Observable<VeggieSummary> y el observable interno ni siquiera se está suscribiendo...
¿Cómo puedo tener un Observable<VeggieSummary[]> con operadores rxjs?
nota: la versión angular de mi aplicación no es compatible con pipe. La versión RxJS es v5
¿Podría intentar envolver la matriz con forkjoin para ver si soluciona el problema? Creo que actualmente está devolviendo Observable<VeggieSummary>[]
getTransactionDetails(1) .flatMap(transactionDetails=> forkJoin(transactionDetails.veggiesList .map(veggie=>getVeggieSummary(veggie.id)))) .subscribe(result=> console.log(result) )Solo necesita envolver el observable interno con forkJoin , esto convierte el Observable<VeggieSummary>[] en Observable<VeggieSummary[]>
getTransactionDetails(1) .flatMap((transactionDetails) => forkJoin( transactionDetails.veggiesList.map((veggie) => getVeggieSummary(veggie.id) ) ) ) .subscribe((result) => console.log(result));con forkjoin, esto funciona:
getTransactionDetails(1) .flatMap((transactionDetails) => forkJoin( transactionDetails.veggiesList.map((veggie) => getVeggieSummary(veggie.id) ) ) ) .subscribe((result) => console.log(result));Encontré zip con el operador de propagación (...) también funciona:
getTransactionDetails(1) .flatMap((transactionDetails) => zip( ...transactionDetails.veggiesList.map((veggie) => getVeggieSummary(veggie.id) ) ) ) .subscribe((result) => console.log(result));Eso lo aprendí de otra publicación.
Pero no estoy seguro de cuál usar, ¿forkjoin o zip? ¿Importa?
También aprendí sobre el operador de descanso/operador de propagación (...) de esa publicación.
Pero todavía no entiendo completamente cómo funciona en este ejemplo.
No estoy seguro de cuál estoy usando, ¿estoy usando el resto o el operador de distribución?
y cual es su equivalente?