5

在 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 现场演示

如何在更改bar$流时保留订阅?更改 bar$ 后,我是否必须处理订阅并设置另一个订阅?

4

1 回答 1

7

Rx 中的一般模式是用值流(即可观察对象)替换状态突变。在这里,而不是重新分配 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,控制台,输出

于 2016-04-26T13:16:53.893 回答