RxJS:链式观察量不使用相同的根可观察值
问题描述:
我正在尝试学习RxJS,并试图构建我认为是一个简单而直接的示例。创建一个间隔生成的随机数的可观察值,然后根据该可观察值使用另外两个可观察值来跟踪已经看到的最低值和最高值。RxJS:链式观察量不使用相同的根可观察值
rStStream似乎表现得像预期的一样,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>
答
https://www.youtube.com/watch?v=3LKMwkuK0ZE
这显卡其实澄清了很多东西给我。特别是在32点的时候,他提到了.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>