Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

201
Vistas
RxJS: cómo transformar un Observable<Observable<Thing>> en Observable<Thing[]>

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

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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$); }) );
over 4 years ago · Santiago Trujillo Denunciar

0

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

  • Comenzamos con 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.
  • A continuación, usamos from() que creará un observable que emite cada valor de nuestra matriz de id .
  • Ahora configuramos nuestra cola http usando mergeMap() .
  • El siguiente es el operador 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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda