在angular2中,是否可以获得可观察的订户数量?

Fee*_*Fum 9 rxjs angular

我想可以继续订阅一个observable而忘记取消订阅.我怀疑这是在我的申请中发生的.观察者是否有一个属性可以给我一个挂掉它的订户的数量?

Ben*_*tan 10

虽然绝对有可能忘记取消订阅,并且泄漏会产生从永不停止到内存泄漏的测试运行器的影响,但angular2有一些工具和常用模式来管理其生命周期.

angular2提供了一种不容忘记的简单方法.在模板中使用时,最简单的方法是简单地使用异步管道,它将自动为您订阅和取消订阅.

否则,当您使用.subscribe()方法时,它将返回订阅.一个常见的做法是抓住在构造函数中注入依赖关系,使内组件的必要订阅ngOnInit和内退订ngOnDestroy.

有时,您将订阅多个可观察量.RxJS将类Rx.Subscription一起提供给组订阅.它可以通过以下方式使用:

const incomeSubscription = income$.subscribe(x => console.log(x));
const expensesSubscription = expenses$.subscribe(x => console.log(x));

const subscription = new Rx.Subscription();
subscription.add(incomeSubscription);
subscription.add(expensesSubscription);
Run Code Online (Sandbox Code Playgroud)

现在调用subscription.unsubscribe()将取消订阅任何仍处于活动状态的订阅.

最后,重要的是要理解默认情况下RxJS流是单播的(与始终缓存结果且仅是多播的promises不同).这实际上意味着每个订阅实际上成为一个新的rx流.例如,对于像Http.get()这样的"冷"可观察对象,每个订阅实际上都会从头开始生成数据.因此,在提到的Http.get()的情况下,您将为每个订阅(或在模板中使用管道异步的实例)进行HTTP调用.

这意味着良好的做法是:

  • 仅在容器样式组件中使用异步管道,并且具有对RxJS一无所知的哑表示组件.这有助于仅在容器级别订阅

  • 如果在订阅者之间共享数据以在某些情况下使用像.refCount()这样的运算符或在其他情况下使用主题.这使得流组播和订阅者共享相同的流而不是每个都有自己的流