Scala 合并采样的可观测数据时出现的问题

Scala 合并采样的可观测数据时出现的问题,scala,rx-java,rx-scala,Scala,Rx Java,Rx Scala,我正在使用RXScala,它是RXJava的一个子项目。我将使用Scala语法,希望大家都能理解 我遇到了奇怪的行为,我不知道这是一个错误还是代表我滥用了rx操作符 问题陈述 我有一个ox:Observable[X]和一个触发器Observabletr:Observable[()]。我想要一个可观察的oy,它是使用函数f:function[X,Y]对ox的转换,但只有在触发时,因为f可能很昂贵 如果ox的最后一个值没有转换值,则oy应为null 一些评论: ox是热的,因为它是UI事件的结果

我正在使用RXScala,它是RXJava的一个子项目。我将使用Scala语法,希望大家都能理解

我遇到了奇怪的行为,我不知道这是一个错误还是代表我滥用了rx操作符

问题陈述 我有一个
ox:Observable[X]
和一个触发器Observable
tr:Observable[()]
。我想要一个可观察的
oy
,它是使用函数
f:function[X,Y]
ox
的转换,但只有在触发时,因为
f
可能很昂贵

如果
ox
的最后一个值没有转换值,则
oy
应为
null

一些评论:

  • ox
    是热的,因为它是UI事件的结果
  • ox
    行为正确(值和计时),正如我用
    println
    调试检查的那样
  • oy
    在正确的时间开火;它只是使用过时的值
    ox
    ,而不是空值
现行代码 上述代码的问题是:它最初工作,但一段时间后,当触发
tr
时,
oy
f
应用于
ox
的旧值。当不更改
ox
时,如果我反复触发
tr
,结果会更新并最终赶上

如果我删除了
合并
以不重置为
null
,那么一切都正常(可能是因为效果不确定)

问题 我的代码有缺陷

  • 我想知道我是否做错了什么
  • 我欢迎实现我所需要的其他方式
  • 为了哈维人
    • 泛型/类型注释:
      ox:Observable[X]
      表示
      Observable-ox
    • lambdas:
      x=>null
      表示
      x->null

    我现在使用的解决方案很短,显然不会导致问题出现:

    tr.withLatestFrom(ox)((_,x) => f(x)) merge problem.map(_ => null)
    

    你能把它翻译成普通的Java吗?@akarnokd我为Java的人添加了一个部分,尽管我怀疑这是否真的必要。我认为在代码行中,您只需将
    =>
    替换为
    ->
    。假设这里的merge()是RxJava中的mergeWith(),那么如果ox是冷的,您就要加倍消耗ox,对于它的每一个值,您都会发出null,并且在触发时可能会发出一个转换值,这可能会失去同步。@akarnokd我检查了rx scala的源代码,而
    merge
    正在使用可观察的静态
    。另外,据我所知,
    ox
    非常热门,因为它是GUI事件(在
    X
    上编辑)的结果。上面的链中涉及一些缓冲区:sample()中的序列化和merge的前端缓冲区。tr到底是什么?如果map()在触发值的发射方面异步运行,则延迟效应可能会发生。
    tr.withLatestFrom(ox)((_,x) => f(x)) merge problem.map(_ => null)