我想可以继续订阅一个观察者并忘记取消订阅。我怀疑这是在我的申请中发生的。观察者是否有一个属性可以让我计算掉掉它的用户?
答案 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
事件以触发从阵列中删除该特定订户。无论哪种方式,你的数组都只包含有效的听众 - 所以它的长度总是告诉你有多少人在那里! :)