此问题可能是由于在Angular应用程序中使用Websocket时使用了RxJS的Subject而引起的。在Websocket的observable中使用Subject时,它可能会在执行一次完整的数据发送过程后立即关闭。
为了解决这个问题,需要在引用Subject时加上share()操作符,这将使得Subject可否缓存数据并在所有订阅者之间共享。
以下是更详细的例子:
import { Injectable } from '@angular/core'; import { Observable, Observer, Subject } from 'rxjs'; import { share } from 'rxjs/operators'; import { environment } from 'environments/environment';
@Injectable()
export class SocketService {
// 缓存Subject
public messages: Subject
// 获取WebSocket的URl
public initWebSocket(): void {
const socketUrl: string = environment.wsUrl;
this.messages = this.createWebSocketObserver(socketUrl).pipe(share()) as Subject
// 创建一个Websocket的可观察对象
private createWebSocketObserver(url: string): Observable
socket.onmessage = (event) => observer.next(event);
socket.onerror = (event) => observer.error(event);
socket.onclose = (event) => observer.complete();
// 返回Subscription以确保在不需要时执行清理操作
return () => socket.close();
});
} }
希望这可以帮助你解决这个问题!