繁体   English   中英

RxJS:取消订阅嵌套订阅

[英]RxJS: unsubscribe from nested subscribe

我使用 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 object 并且我还需要来自内部订阅的消息。

我实现的效果很好,但我认为必须有更好的方法来做到这一点。

(我试过 rx-stomp,但它有很多错误。)

您说您尝试了 rx-stomp 但您是否尝试过 rx-stomp 的 Angular2+ 版本,称为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 -消息

例如:

this.rxStompService.watch('/topic/demo').subscribe((message: Message) => {
      this.receivedMessages.push(message.body);
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM