【发布时间】:2021-10-15 23:20:00
【问题描述】:
我有一个由多个组件组成的聊天应用程序(例如,一个组件包含组列表,另一个包含消息等),当一个组件打开时,另一个组件必须关闭。
所以这是我用来提供 webSocket 连接的服务:
@Injectable()
export class ChatConnectionService {
private _connection: Subject<any>;
constructor(private window: WindowAbstract) { }
public closeConnection(): void {
this.connection.complete();
}
public send(msg: ChatRequest): void {
this.connection.next(msg);
}
public messages(): Subject<any> {
return this.connection;
}
private get connection(): Subject<any> {
if (!this._connection || this._connection.closed) {
this._connection = webSocket(`https/myapp/chat`);
}
return this._connection;
}
}
这是some.component.ts中的一个用法示例:
private messages$: Subscription;
ngOnInit(): void {
this.messages$ = this.chatConnectionService.messages()
.subscribe(m => this.handleInboundMessage(m));
}
ngOnDestroy() {
this.messages$.unsubscribe();
}
现在的问题是,当我在组件之间切换时,一旦旧组件被销毁时取消订阅,新订阅似乎不起作用,它不会发送或接收消息,也不会产生任何错误.
但是当我删除取消订阅行时,它开始工作,但也继续使用旧订阅接收消息,这不是我真正想要的。
总结一下——我需要维护一个连接,但有可能让多个组件根据需要订阅和取消订阅,是否可以使用 RxJs 来完成它?或者我做错了什么?任何建议将不胜感激,谢谢!
【问题讨论】:
-
阅读速度很快,可能无济于事,但可能使服务成为单身,或者共享重播可能会有所帮助
-
您确定您的组件实际上共享同一个服务实例吗?当您在 Angular 中为依赖注入声明服务时,您必须指定服务的“范围”。我在 Injectable 装饰器中看不到
providedIn: 'root',这是声明全局服务的常用方法。因此,您的组件可能都有自己的私有服务实例。这并不能解释整个问题,但无论如何,确保在所有组件之间共享一个服务实例很重要。 -
我确定,它是在包含组件的模块中声明的
-
你能创建一个最小的 repo 吗?
-
您在
ChatConnectionService的哪个位置实例化了connection?
标签: angular websocket rxjs rxjs6