2016-12-07 75 views
4

更新角及RX:改進的預約集合

後,發現該溶液我寫了根據公認的答案小幫手ng2-rx-collector使它更容易使用。希望它能幫助一個人一次又一次面對同樣的問題。

原來的問題

假設我們有一個在炎熱的觀測兩個訂閱的組件。我們同意他們在ngOnInit,爲了避免內存泄漏/意外的行爲在ngOnDestroy退訂:

public ngOnInit() { 
    this.s1 = o1.subscribe(console.debug.bind(console)); 
    this.s2 = o2.subscribe(console.debug.bind(console)); 
} 

public ngOnDestroy() { 
    this.s1.unsubscribe(); 
    this.s2.unsubscribe(); 
} 

我愛的Rx,但我真的希望每一個我需要遵循這個時候自殺:

  1. 爲每個訂閱
  2. 分配此屬性訂閱創建私有財產訂閱(這看起來非常難看,因爲真正的邏輯進入右側)
  3. 從EAC退訂h訂閱破壞

有沒有什麼辦法可以改善呢?

E.g.在RxSwift他們有一個DisposeBag爲了改進工藝,轉換爲打字稿是:

private let bag = DisposeBag(); 

... 

o1.subscribe(...).addDisposableTo(bag); 

,然後只摧毀它只有一次。問題是我找不到任何類似的Subscription函數。

任何想法/提示將受到熱烈歡迎。

+0

您可以在超類中創建一個數組,並將您的訂閱推送到此數組。然後在超類'ngOnDestroy'上,你可以從數組元素中取消訂閱。 – echonax

+0

這並不能解決我需要將整個observable包裝在括號內等問題。我已經嘗試過這種方式,甚至寫了一個自動完成的小修飾器,但它看起來並不好看。 – smnbbrv

回答

5

你可以這樣做:

private teardown$ = new Subject<void>(); 

public ngOnInit() { 
    o1.takeUntil(this.teardown$).subscribe(console.debug.bind(console)); 
    o2.takeUntil(this.teardown$).subscribe(console.debug.bind(console)); 
} 

public ngOnDestroy() { 
    this.teardown$.next(); 
} 
+0

這看起來非常整齊,感覺完全像我正在尋找的東西。非常感謝你!你知道任何利用這種方法解決問題的圖書館嗎? – smnbbrv

+0

不客氣!我還不知道任何圖書館,但也有興趣有一個。 – philipooo

+1

https://github.com/smnbbrv/ng2-rx-collector - 現在你可以使用它:)如果你知道一些方法來改善它,請讓我知道... – smnbbrv

2

你描述使用什麼樣的RxJS 4被稱爲「一次性」(糾正我,如果我」錯),或在RxPHP爲好。在RxJS 5中,這稱爲Subscription,但目的完全相同。

在以下示例中,我有兩個源Observable。我使用一個Subscription對象包裝它們的取消訂閱調用對象,該對象在調用其unsubscribe()方法時將回調用作參數。

var source1 = Observable.interval(250); 
var source2 = Observable.interval(350); 

let sub1 = source1.subscribe(val => console.log(val)); 
let sub2 = source2.subscribe(val => console.log(val)); 

let subscriptions = new Subscription(() => { 
    sub1.unsubscribe(); 
    sub2.unsubscribe(); 
}); 

setTimeout(() => { 
    subscriptions.unsubscribe(); 
}, 3000); 

同樣地,我也可以從source1.subscribe第一Subscription並添加另一個Subscription那會使用add()方法自身的unsubscribe()調用一起被稱爲:

var source1 = Observable.interval(250); 
var source2 = Observable.interval(350); 

let subscriptions = source1.subscribe(val => console.log(val)); 
subscriptions.add(source2.subscribe(val => console.log(val))); 

setTimeout(() => { 
    subscriptions.unsubscribe(); 
}, 3000); 

欲瞭解更多信息看看源代碼:https://github.com/ReactiveX/rxjs/blob/master/src/Subscription.ts