Вы должны взять под контроль свои собственные предметы, вместо того, чтобы использовать WebSocketService.connect
и предполагать, что вы получите желаемое поведение.
Из ссылки на исходный код WebSocketService
, который вы разместив, мы видим, что это простая тема. Функциональность, которую вы хотите - выдача значения при подписке (при условии, что она существует) - предоставляется ReplaySubject
.
. Вы должны объявить локальный ReplaySubject
, на который будут подписываться ваши компоненты. Вы бы тогда подписались на свой WebSocketService
. Все ответы, пришедшие с WebSocketService
, будут сопоставлены с состоянием, а затем отправлены в локальную тему.
const url = 'ws://localhost:8080
@Injectable({
provideIn: 'root',
})
export class MyService{
// Declare local ReplaySubject that emits the last value upon subscription
private subject: Subject<Status> = new ReplaySubject<Status>(1);
constructor(wsService: WebSocketService) {
// Subscribe to the web socket service.
// Subscribing in constructors is fairly bad practice,
// although you can get away with it in singleton services
wsService.connect(url).pipe(
// map responses to statuses
map((response: MessageEvent): Status => {
let data = JSON.parse(response.data);
return data;
})
).subscribe((status: Status) => {
// send the status to all subscribers
this.subject.next(status);
});
}
getObs(): Observable<Status> {
return this.subject.asObservable();
}
sendMsg(msg): void {
this.subject.next(msg);
}
}