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

时间:2016-07-28 04:41:36

标签: angular rxjs

我想可以继续订阅一个观察者并忘记取消订阅。我怀疑这是在我的申请中发生的。观察者是否有一个属性可以让我计算掉掉它的用户?

2 个答案:

答案 0 :(得分: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);

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

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

这意味着最好:

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

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

  • 使用angular v4 +,将| async与secondaryName(stream$ | async as streamData)结合使用已成为一种很好的做法,因此在容器组件中,如果使用可观察值的值不止一次,您不会多次订阅可观察的

答案 1 :(得分:1)

我有这个问题,我通过构建一个订阅数组来解决它:

import { Subscription } from 'rxjs/Rx';

private subValueChanges: Array<Subscription>;

然后每次订阅时,请按下阵列:

this.subValueChanges.push(
  this.someControl.valueChanges
      .debounceTime(1000)
      .distinctUntilChanged()
      .takeUntil(this.destroyValueChanges$)
      .subscribe (newValue => {...}
);

然后你知道阵列的长度是多少用户“有些控制”。具有

我不建议将其作为一种解决方案,但有些情况可能会有用(我有一个)。

同样令人感兴趣的是订阅有一个标志已关闭&#39;您可以检查的属性 - 例如,如果它已关闭,您可以将其从阵列中删除。或者,当您第一次订阅时,设置onunsubscribe事件以触发从阵列中删除该特定订户。无论哪种方式,你的数组都只包含有效的听众 - 所以它的长度总是告诉你有多少人在那里! :)