这是真的?我目前有点困惑:根据另一个热的观察结果制作的可观察的(合并,扫描, Map ,滤镜......)肯定很热吗?
我和我一起融合了冷热观察吗?是新的可观察的冷热吗?
编辑:测试,结果不是预期的
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)
正如他在回答中提到的那样,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: I'm using rxjs 5
1 回答
那是正确的 . Hot只是意味着它可以在没有订阅者的情况下产生事件 . 因此,如果一个源是热的,那么无论后面发生了什么,该源都将保持热点 .
考虑一个鼠标事件处理程序的简单示例 .
无论您附加什么操作符,源(鼠标事件处理程序)都会为每个鼠标移动生成一个新事件 . 如果没有连接侦听器,那么这些事件都不会被处理,并且在
mousemove
之后没有任何逻辑做任何事情,但这些事件仍然会尽职尽责地创建然后默默地被遗忘 .有一些例外情况可以通过使用
replay
来表示热_1171673_,但这只是为未来订阅者缓冲事件,而不是改变源的性质 .关于合并冷热的问题 . 由于其中一个源是热的,因此组合的源也将被认为是热的,因为无论订户的存在如何,它都将继续产生事件 . 即