如何在Angular中完全破坏RXjS对象

时间:2017-06-17 21:55:18

标签: javascript angular typescript rxjs rxjs5

我有角度(4)应用程序,我正在使用EventEmitter来进行某些事件。

因此,每个eventEmitter约有50个订阅。我想知道快速销毁所有这些的方法。

1)我知道将每个Observable / Subject对象推送到数组的方式,但它真的很脏。我们的应用程序中有很多丑陋的代码,当我看到它时,我的眼睛正在涌出血液。

2)当我们可以使用.takeUntil.takeWhile时,我知道另一种方式,但它不是解决方案! (如果我错了,请纠正我)因为订阅者不会响应事件,但Observer会有订阅者。 (如果你还记得每个观察者大约50左右)。订阅者将留在内存中。我不确定,但似乎GC无法破坏这些对象。这真的很糟糕!

因此,据我所知 - 我们应该使用.unsubscribe.complete来杀死订阅者观察者。而且......我们怎么做呢?你现在除了数组之外还有美丽的方式吗?

P.S。我也有关于装饰对象的TS装饰器的想法,但我没有成功的结果...

1 个答案:

答案 0 :(得分:0)

在rxjs5中,每次订阅一个obsevable时,该函数都会返回一个Subscription实例,您可以在以后使用它来取消订阅订阅范围中的observable。举个例子:

$sub: ISubscription;
obs$: Observable<any> = ... //some observable instance

method(){
   $sub = obs$.subscribe(...);//subscribe to the stream
}

dispose(){
   $sub.unsubscribe(); // now there is one less element listening to the stream
}

另一种方法是,如果您将大量订阅存储在单个变量中,您将使用单一方法进行处理,则将所有订阅存储在数组中,然后在循环中调用.unsubscribe。

通常在组件中,您可以看到methodngOnInit或组件constructordisposengOnDestroy

PS:如果您从EventEmitter引用@angular/core,那么对我而言,您有如此大量的元素订阅EventEmitter实例并且说实话,这听起来很奇怪。 ..