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

381
Vistas
¿Cómo puedo obtener el valor de RxJs Observable en una matriz anidada de objetos para resolver?

Actualmente estoy haciendo una solicitud que devuelve datos para algunos archivos y un usuario.

Para cada archivo, quiero devolver un objeto con datos, pero una de las claves depende de otra solicitud.

¿Cómo puedo hacer esta solicitud para que la función getData espere hasta que el observable interno se resuelva en un valor?

 function getData() { return forkJoin([ filesApiRequest), userApiRquest ]) .pipe(map(([files, userInfo]) => { return files.getFilesList() .map((file) => { const name = file.getName(); const importantInfo = importantInfoCall(userInfo.name, name); // returns an observable. // How can I get the value from this before returning? I need this piece of data for each // file in the files list. return { data1, data2, name, ..., hasImportantInfo: importantInfo }; }) })); }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Debe usar un "operador de mapeo de orden superior" ( switchMap ) que se suscribirá a su fuente observable interna y emitirá los datos que necesita. En su caso, debe realizar muchas llamadas ( una para cada archivo ), de modo que pueda asignar su lista de archivos a una matriz de observables que emitan los datos deseados. Puede usar forkJoin nuevamente para envolver todas estas llamadas en un solo observable:

 function getData() { return forkJoin([filesApiRequest, userApiRquest]).pipe( switchMap(([files, userInfo]) => forkJoin( // return array of observables files.getFilesList().map(f => toDataWithImportantInfo$(f, userInfo)) )) ); }
 function toDataWithImportantInfo$(file, userInfo) { const name = file.getname(); return importantInfoCall(userInfo.name, name).pipe( map(importantInfo => ({ data1, data2, name, ..., hasImportantInfo: importantInfo }) ); }

forkJoin no es la mejor solución cuando tiene una gran cantidad de solicitudes, porque las ejecutará todas al mismo tiempo ( tal vez no desee iniciar 500 solicitudes http a la vez ).

Para limitar la cantidad de solicitudes, podemos usar merge en su lugar, ya que proporciona un parámetro de concurrencia:

 function getData() { return forkJoin([filesApiRequest, userApiRquest]).pipe( switchMap(([files, userInfo]) => merge( files.getFilesList().map(f => toDataWithImportantInfo$(f, userInfo)) , 5)), // MAX 5 CONCURRENT toArray() ); }

forkJoin emite una matriz de todos los resultados cuando se completan todas las fuentes. merge emite cada resultado individualmente, por lo que se necesita toArray si desea emitir una sola matriz una vez que se completen todas las fuentes internas ( en lugar de emitir individualmente ).

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