2017-06-17 88 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秒。 –