Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

197
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda