我有以下代码:
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作为懒惰评估的概念,它不会发出值,直到我问它。
答案 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))
如果您想更准确地了解正在进行的订阅链,可以参考以下有关插图数据流的答案: