我使用rx-scala,它是rx-java的子项目。我将使用Scala语法并希望每个人都理解。
我遇到了奇怪的行为,而且我不知道这是否是代表我的rx运营商的错误或误用。
我有ox: Observable[X]
和触发器可观察tr: Observable[()]
。我想要一个可观察的oy
,它是ox
使用函数f: Function[X,Y]
的转换,但只有在触发时,f
可能很昂贵。
如果ox
的最后一个值没有转换值,则oy
应为null
。
一些评论:
ox
很热,因为它是UI事件的结果。ox
行为正确(值和时间),正如我使用println
调试一样。oy
在正确的时间开火;当它是一个非空值时,它只使用过时的ox
值。 oy = ox.sample(tr).map(f).merge(ox.map(x => null))
上述代码的问题是:它最初有效,但过了一段时间,当触发tr
时,oy
正在将f
应用于ox
的旧值。如果不更改ox
,如果我重复触发tr
,结果会更新并最终赶上来。
如果我删除merge
以不重置为null
,那么一切正常(可能,因为效果似乎不确定)。
我提出的代码是错误的。
ox: Observable[X]
表示Observable<X> ox
x => null
表示x -> null
答案 0 :(得分:0)
我现在正在使用以下解决方案,该解决方案很简短,显然不会导致问题出现:
tr.withLatestFrom(ox)((_,x) => f(x)) merge problem.map(_ => null)