Событие onsossage Websocket сработало только один раз - PullRequest
0 голосов
/ 24 июня 2018

Я использую базовый клиент 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);, который сделал то, что должен был сделать)

1 Ответ

0 голосов
/ 27 июня 2018

пришлось удалить observer.complete(); из наблюдателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...