在保持订阅的情况下更改可观察的流

问题描述:

在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

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