【问题标题】:RxJS: Chained Observables Not Using the Same Root Observable ValuesRxJS:链式 Observable 不使用相同的根 Observable 值
【发布时间】:2017-07-25 22:43:18
【问题描述】:

我正在尝试学习 RxJS,并且我正在尝试构建一个我认为简单明了的示例。创建一个按间隔生成的随机数的 observable,然后使用基于该 observable 的另外两个 observable 来跟踪已看到的最低值和最高值。

rngStream 的行为似乎与预期一样,minStream 和 maxStream 似乎也都可以正确跟踪。我遇到的问题是,当它执行时,似乎 rngStream、minStream 和 maxStream 在每个间隔上都有不同的随机数。我正在尝试了解这是否符合预期,或者我只是设置不正确。

我的目标是这样的输出:

[27, 27, 27]
[13, 13, 27]
[90, 13, 90]
[42, 13, 90]
...

let rngStream = Rx.Observable
  .interval(1000)
  .map(() => Math.ceil(Math.random()*100))
  .take(5);

// Track the lowest number we've seen.
let minStream = rngStream
  .startWith(100)
  .scan((x, y) => Math.min(x, y))

// Track the highest number we've seen.
let maxStream = rngStream
  .startWith(0)
  .scan((x, y) => Math.max(x, y))

Rx.Observable.zip(rngStream, minStream, maxStream)
  .subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.2/Rx.min.js"></script>

【问题讨论】:

    标签: rxjs rxjs5


    【解决方案1】:

    https://www.youtube.com/watch?v=3LKMwkuK0ZE

    这个视频实际上为我澄清了很多事情。特别是在 32:00 标记处,他提到了.share,它可以进行可观察的多播。默认情况下,每个订阅者都会获得自己的副本。所以修复看起来像这样:

    let rngStream = Rx.Observable
      .interval(1000)
      .map(() => Math.ceil(Math.random()*100))
      .take(5)
      .share();
    
    // Track the lowest number we've seen.
    let minStream = rngStream
      .startWith(100)
      .scan((x, y) => Math.min(x, y))
    
    // Track the highest number we've seen.
    let maxStream = rngStream
      .startWith(0)
      .scan((x, y) => Math.max(x, y))
    
    Rx.Observable.zip(rngStream, minStream, maxStream)
      .subscribe(console.log);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.2/Rx.min.js"></script>

    【讨论】:

      猜你喜欢
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多