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

97
Vistas
Matriz de suscripciones internas con rxjs

Estoy tratando de mejorar el aplanamiento y reducir el encadenamiento dentro de mi código Rxjs.

Una llamada REST de mi servicio getAllItems() devuelve los siguientes elementos[]:

 [{ id: 101, name: 'Car', owner: 1 }, { id: 102, name: 'Table', owner: 2 }]

Tengo otro punto final getOwnerInfo(id:number) que proporciona información basada en la identificación del "propietario", información que quiero combinar, por lo que la respuesta final debería verse así:

 [{ id: 101, name: 'Car', owner: { id: 1, username: 'Mikelinin', name: 'Mikel', }, }, { id: 102, name: 'Table', owner: { id: 2, username: 'Thominin', name: 'Thomas', }, }]

Mi implementación actual se suscribe una vez a la llamada getAllItems y luego, en el cuerpo de la suscripción, itera por elemento suscribiéndose a getOwnerInfo .

He estado mirando otros ejemplos de aplanamiento, pero básicamente "rompen" la matriz y nunca la vuelven a armar. Necesito que la salida sea una matriz.

Intenté usar from() , concatMap() y mergeMap() pero parece que no puedo combinar ambas solicitudes correctamente.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Lo siguiente utilizará from para convertir una matriz distinta de ID de propietario en una secuencia de ID de propietario. Luego usará toArray para convertir ese flujo nuevamente en una matriz y asignar la matriz de elementos a una matriz de elementos con su objeto propietario respectivo.

 this.getAllItems().pipe( switchMap(items => { const ownerIds = Array.from(new Set(items.map(x => x.owner))); return from(ownerIds).pipe( concatMap(x => this.getOwnerInfo(x)) toArray(), map(owners => items.map(x => ({ ...x, owner: owners.find(y => y.id === x.owner) }))) ) }) )
about 4 years ago · Juan Pablo Isaza Denunciar

0

Asigne su matriz de elementos a una matriz de observables, cada uno de los cuales emite el elemento actualizado. Luego, une la matriz de observables.

 getAllItems().pipe( // turn item[] into observable<updatedItem>[] map(items => items.map(item => getOwnerInfo(item.id).pipe( map(owner => ({...item, owner})) ), // join observable<updatedItem>[] into updatedItem[] switchMap(itemCalls => forkJoin(itemCalls)) ).subscribe(console.log);

O puede hacer el mapeo y unirse en un solo paso:

 getAllItems().pipe( // source item[], do stuff, emit updatedItem[] switchMap(items => forkJoin( items.map(item => getOwnerInfo(item.id).pipe( map(owner => ({...item, owner})) )) )) ).subscribe(console.log);
about 4 years ago · Juan Pablo Isaza 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