Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

188
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!