Realmente no sé cómo extraer los valores del método subscribe().
getMessages(): any { this.gatewayMessagesState$.subscribe(data => data.gatewayMessages .get(this.gatewayId) ?.list .map(Message => Message.message)); }gatewayMessagesState es un estado inicial que contiene algunos datos. gatewayMessages es un mapa con gatewayIds como claves y matrices de objetos Message como valores. El mensaje tiene un campo de mensaje que es solo una cadena. Me gustaría extraer una serie de mensajes para una identificación dada. ¿Cómo puedo hacer eso?
Si desea recuperar los datos como un observable de mensajes como una cadena, puede definir la función de retorno como esta y usar operaciones de tubería y mapa de rxjs, este es el código a continuación es mi propuesta
getMessages(): observable<string[]>{ return this.gatewayMessagesState$.pipe(map((data) => data.filter((f) => f.gatewayMessages.id ===this.gatewayId)), map(item => item.message)); }Lo que probablemente quiera hacer es llenar otro Observable con los datos para que pueda acceder a ellos en cualquier otro lugar de su proyecto sin necesidad de llamar a la API más de una vez.
Para hacer esto, crea lo que se conoce como Asunto (en este caso, un Sujeto de Comportamiento) y puede completarlo con datos cuando su llamada API devuelve una respuesta.
Luego, para acceder a estos datos en otro lugar, puede crear una función "obtener" para devolver el Sujeto (que en sí mismo es un Observable) siempre que necesite los datos.
Aquí hay un ejemplo:
mi - data.service.ts
myData: BehaviorSubject < number > = new BehaviorSubject < number > (0); callApi() { this.dbService.get('apiUrl').subscribe( (data) = > this.myData.next(data) // Assuming data is a 'number' ); } getMyData() { return this.myData.asObservable(); }Ahora para usar esto en un componente:
this.myService.getMyData().subscribe( (data) = > { /* Use the value from myData observable freely */ } );O puede confiar en la tubería asíncrona angular (que es un método muy conveniente para tratar con observables en su código).
No estás especificando si getMessages está en un servicio, componente... en cualquier caso, sugiero devolver el Observable sin suscribirte a él en la función getMessages
// this function could be anywhere getMessages(): Observable<string[]> { return this.gatewayMessagesState$.pipe( map((data) => data.gatewayMessages.get(this.gatewayId)), map((yourMap) => yourMap?.list.map((theMessage) => theMessage.message)) ); }Ahora, si necesita extraer este valor, ya sea de un componente, un servicio, etc., simplemente llame a esta función y luego suscríbase para obtener el resultado.
Digamos que getMessages está en un archivo de servicio, por ejemplo
tu componente
constructor(private theService: YourService) {} anotherFunction() { this.theService.getMessages().subscribe((myMessages) => console.log(myMessages)); }O deje que la tubería asíncrona se suscriba a este observable
tu componente
messages$!: Observable<string[]> constructor(private theService: YourService) {} anotherFunction() { this.messages$ = this.theService.getMessages() }Tu componente html
<ng-container *ngIf="messages$ | async as messages"> <div *ngFor="let message of messages"> <p>{{ message }}</p> </div> </ng-container>