【发布时间】:2020-12-29 18:42:25
【问题描述】:
我使用 SockJS 和 StompJS,当我在浏览器中打开我的应用程序时,有时它会在连接到 websocket 之前尝试订阅一些主题。我希望主题订阅等到应用连接到 websocket。
export class SocksService {
...
public subscribe<T>(destination: string, callback?: (body: T) => void, headers?: object): Observable<Subscription> {
const subscription = new Subject<Subscription>();
headers = headers || {};
this.status.pipe(
first(status => status === ConnectionStatus.CONNECTED)
).subscribe((status: ConnectionStatus) => {
subscription.next(this.stompClient.subscribe(destination, (message: Message) => {
if (callback) {
callback(JSON.parse(message.body) as T);
}
}, headers));
});
return subscription.asObservable();
}
...
}
这就是我实现这段代码的原因,我这样称呼它:
this.socksService.subscribe<User>('/topic/user', (user: User) => {
console.log('user received', user);
}).subscribe(subscription => this.userSubscription = subscription);
所以我只在连接状态为connected时才订阅主题,并且只会在客户端第一次连接成功时调用。
我想稍后退订该主题,所以我需要内部订阅返回的Subscription 对象,我还需要来自内部订阅的消息。
我实现的效果很好,但我认为必须有更好的方法来做到这一点。
(我尝试了 rx-stomp,但它有很多错误。)
【问题讨论】:
标签: javascript websocket rxjs stomp