使用Subscribers和subscription.first()时Angular2 +内存泄漏

时间:2019-01-29 09:05:51

标签: angular rxjs observable

我正在使用通过电子运行的Angular2应用程序。 目前,我正在寻求提高应用程序的性能并减少内存泄漏。我了解您需要在销毁应用程序时销毁订户,以防止他们关注新的价值。但是您是否需要销毁只能运行一次的订阅?

ObservableVar.subscribe().first((ans) => { // Wanting to use only one ans
    dostuff(ans);
}

1 个答案:

答案 0 :(得分:3)

不,您不需要销毁仅运行一次的订阅,因为可观察的内容将自行完成。如果使用take(1),这是相同的。

这是有关firsttake的RxJS文档。

您必须像这样使用它们:

myOvservable.pipe(first()).subscribe(value => { /* do something */ });
myOvservable.pipe(take(1)).subscribe(value => { /* do something */ });

如果您要取消订阅多个订阅,则可能值得使用takeUntil技巧。您创建一个主题,当您希望观察值完成时在其中输入虚拟值:

unsubscribe = new Subject<void>();

myObs1.pipe(takeUntil(this.unsubscribe)).subscribe(value => { /* do something */ });
myObs2.pipe(takeUntil(this.unsubscribe)).subscribe(value => { /* do something */ });

// trigger the unsubscription
this.unsubscribe.next();
  

注意:takeUntil应该是管道序列中的最后一个运算符,以避免泄漏(see this article)。

您还可以使用Subscription类来管理您的订阅:

subscriptions = new Subscription();

this.subscriptions.add(myObs1.subscribe(value => { /* do something */ }));
this.subscriptions.add(myObs2.subscribe(value => { /* do something */ }));

// unsubscribe
this.subscriptions.unsubscribe();