首页 文章

基于另一个热的观察者制作的可观察性肯定是热的吗?

提问于
浏览
0

这是真的?我目前有点困惑:根据另一个热的观察结果制作的可观察的(合并,扫描, 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 回答

  • 1

    那是正确的 . Hot只是意味着它可以在没有订阅者的情况下产生事件 . 因此,如果一个源是热的,那么无论后面发生了什么,该源都将保持热点 .

    考虑一个鼠标事件处理程序的简单示例 .

    var mousemove = Rx.Observable.fromEvent(window, 'mousemove');
    

    无论您附加什么操作符,源(鼠标事件处理程序)都会为每个鼠标移动生成一个新事件 . 如果没有连接侦听器,那么这些事件都不会被处理,并且在 mousemove 之后没有任何逻辑做任何事情,但这些事件仍然会尽职尽责地创建然后默默地被遗忘 .

    有一些例外情况可以通过使用 replay 来表示热_1171673_,但这只是为未来订阅者缓冲事件,而不是改变源的性质 .

    关于合并冷热的问题 . 由于其中一个源是热的,因此组合的源也将被认为是热的,因为无论订户的存在如何,它都将继续产生事件 . 即

    //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]));
    

相关问题