问题描述
我使用 SockJS 和 StompJS,当我在浏览器中打开我的应用程序时,有时它甚至会在连接到 websocket 之前尝试订阅某些主题。我希望主题订阅等到应用连接到 websocket。
a.hpp
这就是我实现这段代码的原因,我称之为:
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
对象,并且我还需要来自内部订阅的消息。
(我试过 rx-stomp,但它有很多错误。)
解决方法
您说您尝试过 rx-stomp,但您是否尝试过 Angular2+ 版本的 rx-stomp,称为 ng2-stompjs?它将关键类公开为 Angular 可注入服务。
在 rx-stomp 下看到它的提及,在这里: https://github.com/stomp-js/ng2-stompjs#documentation
...它的实现(Angular 7)通过一个很好的一步一步,在这里: https://stomp-js.github.io/guide/ng2-stompjs/ng2-stomp-with-angular7.html#receiving-messages
例如:
mid