【问题标题】:Changing observable stream while keeping subscription在保持订阅的同时更改可观察流
【发布时间】:2016-04-25 15:55:09
【问题描述】:

在 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$ 后,我是否必须处理订阅并设置另一个订阅?

【问题讨论】:

  • 你为什么不测试一下呢?这很容易做到。我希望 barFunc 像往常一样接收它的值。您不订阅foo$,而是订阅foo$ 引用的内容(在订阅时)。如果foo$ 稍后更改,它不应更改订阅的任何内容。但正如我所说,测试它并告诉我们结果。
  • 我已经更新了代码并在 jsbin 上进行了测试。没运气。还有其他想法吗?
  • ... Rx.Observable.never 是一个从不发出值的可观察对象... 你做梦也想不到更糟糕的测试示例。

标签: javascript rxjs observable reactivex


【解决方案1】:

Rx 中的一般模式是用值流(即 observable)替换状态突变。在这里,而不是重新分配 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2020-09-08
    • 2017-06-07
    • 2019-12-03
    相关资源
    最近更新 更多