2016-04-25 52 views
3

在RxJS中,我希望即使在流更改後,訂閱仍保留在流上。下面我用了一個間隔流來測試行爲在保持訂閱的情況下更改可觀察的流

//Works because foo$ is unchanged 
let foo$ = Rx.Observable.interval(1000); 
foo$.subscribe(x => console.log(`foo$: ${x}`)); 

//Doesn't work because bar$ is changed 
let bar$ = Rx.Observable.never(); 
bar$.subscribe(x => console.log(`bar$: ${x}`)) 
bar$ = Rx.Observable.interval(1000); 

jsbin Live Demo

如何堅持訂閱,同時改變bar$流? 我是否在處理訂閱並在更改bar $後設置另一個訂閱?

+0

你爲什麼不考呢?這很容易做到。我希望barFunc像往常一樣接收它的值。您不會訂閱'foo $',而是訂閱'foo $'引用(訂閱時)。如果'foo $'稍後改變,它不應該改變訂閱的任何內容。但正如我所說的那樣測試並告訴我們結果。 – user3743222

+0

我已經更新了代碼並在jsbin上進行了測試。沒有運氣。任何其他想法? – ckwong

+0

... Rx.Observable.never是一個永遠不會發出任何值的可觀察值......你無法想象出一個更糟糕的測試例子。 – user3743222

回答

3

Rx中的一般模式是用值流(即可觀察的)代替狀態變異。在這裏,bar而不是重新分配bar $,bar應該被建模爲Observable<Observable<T>>(也就是類型T的值流的流)。然後它可以被「扁平化」爲一組值(在這種情況下,使用switch)。

例如:

const bar$ = new Rx.Subject(); 
bar$.switch().subscribe(x => console.log(`bar$: ${x}`)); 
bar$.onNext(Rx.Observable.fromArray([1,2,3])); 
bar$.onNext(Rx.Observable.interval(1000).take(3)); 

https://jsbin.com/firoso/edit?js,console,output