这是真的吗?我现在有点困惑: 根据另一个热的观察结果制作的可观察的(合并,扫描,地图,过滤器......)肯定很热吗?
我是否将冷热观察合并在一起?是新观察到的冷热吗?
var source = Rx.Observable.fromEvent(window, 'mousemove')
.merge(Rx.Observable.from([1,2,3,4,5]))
.scan(acc=>++acc, 0);
setTimeout(()=>{
source.subscribe(x=>{
console.log('sub1', x)
})
}, 4000)
setTimeout(()=>{
source.subscribe(x=>{
console.log('------sub2', x)
})
}, 6000)
正如 paulpdaniels 在他的回答中提到的那样,mousemove应该是一个热门观察者,所以即使没有订阅,它也应该发出值。
但是在上面的代码示例中,我将订阅延迟了4秒和6秒。所以当应用程序启动时,我会移动鼠标。当它达到第4秒时,它会退出:
"sub1" 1
"sub1" 2
"sub1" 3
"sub1" 4
"sub1" 5
为什么它从1
开始?它不应该累积值4秒?它应该从我理解的更多数字开始。
当它达到第6秒时,它会退出:
"------sub2" 1
"------sub2" 2
"------sub2" 3
"------sub2" 4
"------sub2" 5
为什么呢?并不意味着mousemove是冷可观察的?或问题出在scan
运算符??
PS:我使用的是rxjs 5
答案 0 :(得分:1)
这是正确的。 Hot只是意味着它可以在没有订阅者的情况下产生事件。因此,如果一个来源很热,那么无论后来发生什么,该来源都将保持热点。
考虑一个鼠标事件处理程序的简单示例。
var mousemove = Rx.Observable.fromEvent(window, 'mousemove');
无论您附加什么操作符,源(鼠标事件处理程序)都会为每个鼠标移动生成一个新事件。如果没有连接侦听器,那么这些事件都不会被处理,mousemove
之后没有任何逻辑可以执行任何操作,但这些事件仍然会尽职尽责地创建,然后默默地被遗忘。
有一些例外情况可以通过使用Observable
来表达Observable
似乎一样冷replay
,但这只是缓冲事件对于未来的订户,不要改变来源的性质。
关于合并冷热的问题。由于其中一个源是热的,因此组合的源也将被认为是热的,因为无论订户的存在如何,它都将继续产生事件。即。
//Still hot because the mouse does not stop generating events in the
//absence of subscribers.
var source = Rx.Observable.fromEvent(window, 'mousemove')
.merge(Rx.Observable.from([1,2,3,4,5]));