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

时间:2016-12-25 09:44:13

标签: javascript rxjs rxjs5

我有以下代码:



class PointSet:
    def __init__(self, points):
        self.points = points

    def translate(self, x, y):
        for p in self.points:
            p.x += x
            p.y += y

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)观察值的情况下开始发出值? 我理解RxJS作为懒惰评估的概念,它不会发出值,直到我问它。

2 个答案:

答案 0 :(得分:1)

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

这实际上是懒惰评估的整个想法。您订阅了您需要的observable,并且它所依赖的所有其他可观察对象将自动订阅 - 但仅在必要时订阅。取消订阅也是自动完成的,这在组合来自许多不同来源的数据时非常方便。

答案 1 :(得分:1)

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

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

如果您想更准确地了解正在进行的订阅链,可以参考以下有关插图数据流的答案: