为什么 Rx.Observable.of(true) 开始发射

Why Rx.Observable.of(true) starts to emit

我有以下代码:

console.log('start');

//emit value every second
const message = Rx.Observable.interval(1000);
//emit value as soon as subscribed
const trueObs = () => Rx.Observable.of(true);
// start emitting delayed values as soon as trueObs emits
const delayWhenExample = message.delayWhen(trueObs);
//log values start logging after one second
//ex. output: 0...1...2...3
const subscribe = delayWhenExample.subscribe(val => console.log(val));
<script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.8/dist/global/Rx.umd.js"></script>

为什么 Rx.Observable.of(true) 在没有 subscribe observable 的情况下开始发射值?
我将 RxJS 的概念理解为惰性求值,它不会发出值,直到我问它。

你的变量 delayWhenExample 实际上是一个 SubscriptionDelayObservable observable,它是通过调用 delayWhen() 创建的。它跟踪原始的 message 可观察对象和您作为参数传递给它的可观察对象 (delayForFiveSeconds)。当您调用 subscribe() 时,它还会在幕后订阅这两个 observable,它需要计算其值。

这就是惰性求值的全部思想。您订阅了您需要的可观察对象,它所依赖的所有其他可观察对象将自动订阅——但仅在必要时进行。退订也是自动完成的,这在合并来自许多不同来源的数据时非常方便。

我对 Rxjs v5 不是很熟悉,但这可能是正在发生的事情:

  • 您订阅delayByExample,即message.delayWhen(delayForFiveSeconds)
  • 这反过来导致订阅 delayForFiveSeconds 因为可能 delayWhen 运算符订阅了它的两个操作数,即 delayWhen(message, delayForFiveSeconds) 导致订阅了 messagedelayForFiveSeconds,然后当收到来自 delayForFiveSeconds 的值时,将从 message 读取的值向前传递。但是这两个订阅都发生在订阅 delayWhen.
  • 最后一件事是 Rx.Observable.of(true) 将在订阅时同步发出
  • 所以,delayWhenExample.subscribe(val => console.log(val))会立即触发true
  • 的发射

如果你想更准确地理解发生的订阅链,你可以参考以下带有说明数据流的SO答案: