【问题标题】:observable which is made based on another hot observable is definitely hot?基于另一个热门 observable 制作的 observable 肯定很热门?
【发布时间】:2023-03-05 01:23:01
【问题描述】:

这是真的吗?我目前有点困惑: 基于另一个热门 observable 制作(合并、扫描、映射、过滤...)的 observable 肯定很热门?

如果我将 hot 和 cold observable 合并在一起会怎样?新观测到的是热还是冷?


编辑:测试,结果不是预期的

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 应该是一个热门的 observable,因此即使没有订阅它也应该发出值。

但在上面的代码示例中,我将订阅延迟了 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

【问题讨论】:

    标签: rxjs observable


    【解决方案1】:

    没错。 Hot 仅仅意味着它可以在没有订阅者的情况下产生事件。因此,如果某个源很热,那么无论它之后发生什么,该源都将保持热。

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

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

    无论您附加什么运算符,源(鼠标事件处理程序)都会为每次鼠标移动产生一个新事件。如果没有附加监听器,那么这些事件都不会被处理,mousemove 之后的逻辑也不会做任何事情,但这些事件仍然会被尽职尽责地创建,然后被默默地遗忘。

    在一些例外情况下,可以使用replay 使热Observable 像冷Observable 一样出现,但这只是为未来的订阅者缓冲事件,而不是改变来源的性质。

    关于您关于合并冷热的问题。由于其中一个源是热的,那么组合的源也将被认为是热的,因为无论订阅者是否存在,它都会继续产生事件。即

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

    【讨论】:

    • 感谢您的回答,我用一个例子编辑了我的问题。这似乎与您对 hot observable 的描述不符,您能再检查一下吗?谢谢。
    • 我可能不清楚我所说的“发射”是什么意思。鼠标事件流很热,因为无论发生了什么都会生成鼠标事件,但是,在订阅之前,这些事件的处理仍然不会发生。您的示例 预期行为。我会更新以使其更加细致入微。
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2018-04-18
    • 2013-09-19
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多