RxJS:取消订阅嵌套订阅

时间:2020-12-29 18:42:25

标签: javascript websocket rxjs stomp

我使用 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,但它有很多错误。)

1 个答案:

答案 0 :(得分:0)

您说您尝试过 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