Estoy tratando de escribir un código donde un Servicio de curso angular recibe la identificación de inicio de sesión de un estudiante para enumerar todos los cursos en los que se inscribe el estudiante. Este resultado luego se canaliza a otro servicio que toma el resultado de la primera consulta como su entrada.
teachers: ITeacher[]; this.courseService.query({ 'stdId.equals': this.account?.login, }).pipe( map(data=> { this.teacherService.query({ 'courseId.in': data.body, }).subscribe((res: HttpResponse<ITeacher[]>) => { this.teachers = res.body; }) }) );El problema es que puedo ver los resultados en data.body, pero no puedo obtener los valores reales de los datos. P.ej. Si trato de obtener los valores como data.body.id, recibo un mensaje de error que dice que no hay una identificación de campo en la clase o interfaz. Soy nuevo en Angular, así que estas son mis preguntas:
Cualquier ayuda es muy apreciada.
Le sugiero encarecidamente que use un Observable como su "objetivo" final. En lugar de tener teachers como una matriz estática, tendría teachers$ , un Observable, que consumiría en el DOM con la canalización async o en cualquier otra parte de su código. Además, desea evitar suscribirse a Observables dentro de tuberías Observables (las llamadas de suscripción anidadas tienen un olor de código MALO).
Aquí está mi enfoque sugerido:
teachers$: Observable<ITeacher[]>; this.teachers$ = this.courseService.query({ 'stdId.equals': this.account?.login, }).pipe( switchMap(data => this.teacherService.query({ 'courseId.in': data.body, })) ); Cuando necesite suscribirse a un Observable secundario desde dentro de un Observable principal (como en este caso), debe usar un operador de mapeo de orden superior como switchMap , concatMap , mergeMap o exhaustMap . Estos operadores difieren principalmente en sus modelos de concurrencia. Para este caso, dependiendo de cuántas solicitudes se puedan realizar potencialmente, es posible que desee cambiar de switchMap a otra cosa.
Aceptando la sugerencia de esta respuesta , simplemente agregaría la solución a la matriz de identificadores de curso de la siguiente manera:
teachers$: Observable<ITeacher[]>; this.teachers$ = this.courseService.query({ 'stdId.equals': this.account?.login, }).pipe( map(data => data.body.map(({id}) => id)), map(data => this.teacherService.query({ 'courseId.in': data, })) );No lo probé, pero creo que puedes probar esto.