当前位置: 首页 > 知识库问答 >
问题:

RxJS:从嵌套订阅取消订阅

荆学民
2023-03-14

我使用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时才订阅该主题,并且只有在客户端首次成功连接时才会调用该主题。

我想稍后从主题中取消订阅,所以我需要内部订阅返回的订阅对象,我还需要内部订阅的消息。

我所实现的很好,但我认为一定有更好的方法来实现它。

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

共有1个答案

隗驰
2023-03-14

你说过你试过rx-践踏,但是你试过rx-践踏的Angular2版本吗?它将关键类公开为角注入服务。

看到它在rx-践踏下的提及,在这里:https://github.com/stomp-js/ng2-stompjs#documentation

...它的实现(角7)通过一个很好的一步一步,这里:https://stomp-js.github.io/guide/ng2-stompjs/ng2-stomp-with-angular7.html#receiving-messages

例如。:

this.rxStompService.watch('/topic/demo').subscribe((message: Message) => {
      this.receivedMessages.push(message.body);
    });
 类似资料:
  • 我通读了RxJS文档,并希望确保我理解了< code > subscriber . unsubscribe()和< code > subscriber . complete()之间的区别。 假设我有一个有两个订阅者的可观察对象,订阅者1和订阅者2。如果订阅者1对其订阅调用取消订阅,它将不再接收来自可观察对象的通知,但订阅者2将继续接收它们。 <代码>的文档。complete(): 观察者回调,用于

  • 在ngOnDestory中,我取消了两个订阅,但仍然得到前面的错误。 现在我几乎可以肯定问题出在这行:即使我在注销之前取消了proposalSubscription和chatSubscription的订阅,但仍然会出现错误。有没有解决这个问题的方法?而且,我对RXJ和操作符没有太多的经验。有没有操作符可以用来避免这种嵌套订阅? 提前道谢。

  • 本文向大家介绍system.reactive 订阅/取消订阅可观察对象(IDisposable),包括了system.reactive 订阅/取消订阅可观察对象(IDisposable)的使用技巧和注意事项,需要的朋友参考一下 示例 订阅返回IDisposable: 当您准备取消订阅时,只需处置订阅即可:            

  • 微信文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html 组合模板并添加至帐号下的个人模板库 $tid = 563; // 模板标题 id,可通过接口获取,也可登录小程序后台查看获取 $kidLi

  • 开普勒消息目前分为三大类:公告,告警和通知。 通知中根据不同的操作事件类型,分为十几个事件。每个事件都跟项目操作相关。便于接收项目操作变更的通知。 分类 事件 公告 Alarm 告警 Proclaim 通知 Build,Apply,Audit,Delete,Rollback,Logging,Reboot,Command,Storage,Extend... 订阅界面: 用户中心,点击头像,下拉菜单→

  • 什么时候应该存储实例并在NgOnDestroy生命周期中调用,什么时候可以简单地忽略它们? 保存所有订阅会给组件代码带来很多混乱。 HTTP客户端指南忽略订阅,如下所示: 在同一时间的路线和导航指南说: 最终,我们会在别的地方导航。路由器将从DOM中删除该组件并销毁它。在那发生之前我们需要自己清理干净。具体地说,我们必须在Angular破坏组件之前退订。否则可能会造成内存泄漏。 我们在方法中取消订