我正在使用Angular 6应用程序中的基本WebSocket客户端。除了某些原因,
这是我用于处理WebSockets的类:
在这两种情况下,
socket.onmessage
或socket.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();
,这正是它应该做的事情)。
WSEvent
定义。它只是一个包含 WebSocket 事件字符串键的枚举。不到一年后 :) - user1935987