为什么 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)
导致订阅了 message
和 delayForFiveSeconds
,然后当收到来自 delayForFiveSeconds
的值时,将从 message
读取的值向前传递。但是这两个订阅都发生在订阅 delayWhen
. 时
- 最后一件事是
Rx.Observable.of(true)
将在订阅时同步发出
- 所以,
delayWhenExample.subscribe(val => console.log(val))
会立即触发true
的发射
如果你想更准确地理解发生的订阅链,你可以参考以下带有说明数据流的SO答案:
我有以下代码:
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)
导致订阅了message
和delayForFiveSeconds
,然后当收到来自delayForFiveSeconds
的值时,将从message
读取的值向前传递。但是这两个订阅都发生在订阅delayWhen
. 时
- 最后一件事是
Rx.Observable.of(true)
将在订阅时同步发出 - 所以,
delayWhenExample.subscribe(val => console.log(val))
会立即触发true
的发射
如果你想更准确地理解发生的订阅链,你可以参考以下带有说明数据流的SO答案: