2017-06-17 29 views
-1

我有角度(4)应用程序,我正在使用EventEmitter的某些事件。如何以角度摧毁完全的RXjS对象

因此,每个eventEmitter约有约50个订阅。我想知道如何快速消灭他们。 1)我知道我们将每个Observable/Subject对象推送到数组的方式,但它确实很脏。我们的应用程序中有很多丑陋的代码,当我看到它时,我的眼睛正在流血。

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

所以,据我所知 - 我们应该使用.unsubscribe.complete杀死观察者的用户。而且......我们如何做到这一点?除了数组之外,你现在是否有美丽的方式?

P.S.我也有关于TS装饰器收集物体的想法摧毁,但我没有得到成功的结果...

回答

0

在rxjs5,每次你订阅一个obsevable,函数返回一个实例的订阅,你可以稍后用于取消订阅订阅范围中的观察值。以为例:

$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在一个循环。

通常,在组件,您可以看到method要么ngOnInit或组件constructordisposengOnDestroy

PS:如果你从@angular/core,那么它听起来很奇怪,我认为你已经订阅了一份EventEmitter实例是诚实的元素这么大的量...

+0

好的参考EventEmitter,但我对约10K订阅。我如何取消订阅?一看它大约需要10-15秒。 –