Websocket的onmessage事件只触发一次

3
我正在使用Angular 6应用程序中的基本WebSocket客户端。除了某些原因,socket.onmessagesocket.addEventListener('message'只会触发一次。控制台没有错误,并且消息肯定已发送到客户端(正确的消息显示在浏览器控制台的WebSocket连接帧中)。所有其他事件都正常工作。
这是我用于处理WebSockets的类:
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.next(event); 后立即调用了 observer.complete();,这正是它应该做的事情)。

2
我知道现在已经过去了3年,但是WSEvent是什么?我的onmessage也没有成功,我想尝试你的解决方案,但它会出现“WSEvent未定义”的错误。 - Nie Selam
1
嘿,我添加了 WSEvent 定义。它只是一个包含 WebSocket 事件字符串键的枚举。不到一年后 :) - user1935987
2
哦,真糟糕,一年过去了。如果你附近有的话,能和我分享一下吗?我已经在这个问题上忙了一整天了...我似乎无法接收到客户端的消息,但发送方面没问题。 - Nie Selam
1
请按照以下描述进行操作:将“this.config.apiEndpoint”替换为您的ws服务器URL。 - user1935987
1个回答

1

必须从观察器中删除 observer.complete();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接