Я использую базовый клиент WebSocket в приложении Angular 6.
Все работает, кроме того, что по какой-то причине socket.onmessage
или socket.addEventListener('message'
запускаются только один раз. Нет ошибок на консоли. и сообщение окончательно отправляется клиенту (правильное сообщение отображается в фреймах подключения веб-сокета в консоли браузера). Все остальные события работают правильно.
Вот мой класс для работы с веб-сокетами:
export class WebsocketService implements OnDestroy {
socket: WebSocket;
constructor(@Inject(APP_CONFIG) private config: IAppConfig, private authService: AuthService) { }
initConnection(): void {
this.socket = new WebSocket(
this.config.apiEndpoint.replace(/^https?:\/\//i, 'ws://') + 'ws/');
this.watchEvent(WSEvent.ERROR).subscribe(data => {
console.log(data);
});
}
watchEvent(wsevent: WSEvent): Observable<any> {
return new Observable(observer => {
this.socket.addEventListener(wsevent, function (event) {
observer.next(event);
});
});
}
onMessage(): Observable<any> {
return new Observable(observer => {
this.socket.onmessage = function (event) {
observer.next(event);
};
});
}
ngOnDestroy() {
// this.socket.close();
}
}
wsevent:
export enum WSEvent {
CLOSE = 'close',
OPEN = 'open',
MESSAGE = 'message',
ERROR = 'error'
}
использование:
this.wsService.watchEvent('message').subscribe((data) => {
console.log(data);
});
this.wsService.onMessage().subscribe((data) => {
console.log(data);
});
В обоих случаях console.log(data);
показывает мне только первое сообщение, отправленное клиенту. Не имеет значения, сколько раз сообщение было отправлено, а содержимое сообщения - onmessage
(относится к обеим опциям) запускается только один раз.
Обновление:
обновил этот пост, чтобы он содержал реально работающее решение (проблема заключалась в том, что я позвонил observer.complete();
сразу после observer.next(event);
, который сделал то, что должен был сделать)