No soy un experto en tuberías rxJS, tengo un problema que creo que es simple, mi código se reduce a:
getThings = (): Observable<Thing[]> => this.getThingIds().pipe( mergeMap((thingIds: number[]) => thingIds.map((id: number) => this.http.get<Thing>(`url${id}`)) ) ); El problema es que esto devuelve un Observable<Observable<Thing>> . ¿Hay alguna forma de transformar esto en el Observable<Thing[]> necesario con un operador? o estoy completamente equivocado desde el principio.
Básicamente, necesito hacer una solicitud para cada identificación recibida de getThingIds y simplemente transformar todos esos resultados en una matriz
No creo que estés lejos. Puede combinarlos con combineLatest o forkJoin ejemplo:
getThings = (): Observable<Thing[]> => this.getThingIds().pipe( mergeMap((thingIds: number[]) => { const things$ = []; thingIds.forEach((id: number) => things$.push(this.http.get<Thing>(`url${id}`))); return forkJoin(things$); }) );Quería dar una solución que es un poco más eficaz. Si bien forkJoin() logra esto, su suscriptor debe esperar hasta Thing se hayan obtenido todas las cosas antes de emitir datos.
La siguiente solución logra lo mismo, pero le brinda una matriz que crece a medida que se completa cada solicitud HTTP.
getThings$ = this.getThingIds$.pipe( switchMap((ids:number[])=> from(ids).pipe( mergeMap(id=>this.http.get<Thing>(`url${id}`)), scan((things, thing)=>[...things, thing], [] as Thing[]) ) ) );Aquí está la línea por línea
switchMap() en lugar de mergeMap() . Combinar mapas crea una cola mientras que cambiar mapas interrumpirá cualquier solicitud http en curso. Si obtenemos una nueva matriz de identificadores, no queremos esperar a que todos los identificadores antiguos se resuelvan primero.from() que creará un observable que emite cada valor de nuestra matriz de id .mergeMap() .scan() , que es como Array.reduce() pero activa la función interna para cada valor emitido desde la línea anterior (la cola HTTP). Usamos un operador de propagación para agregar cada Thing nueva a nuestra respuesta acumulada.Nota: cambié los métodos a variables ya que ninguno de ellos requería ningún parámetro. Simplemente elimina la más mínima parte de repetitivo.