簡體   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