我使用的是rx-scala,它是rx-java的子项目。我将使用Scala语法,希望大家都能理解。
我遇到了奇怪的行为,我不知道这是一个错误还是错误地使用了rx操作符。
问题陈述
我有一个ox: Observable[X]
和一个触发可观察的tr: Observable[()]
。我想要一个可观察的oy
,它是使用函数f: Function[X,Y]
的ox
的转换,但仅在触发时,因为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
,那么一切都工作正常(可能,因为效果似乎不确定)。
我的代码有bug。
- 我想知道我是否做错了什么。
- 我欢迎实现我需要的其他方式。
For the Jave people
- 泛型/类型注释:
ox: Observable[X]
表示Observable<X> ox
- lambdas:
x => null
表示x -> null
我现在使用以下解决方案,它很短,显然不会导致问题出现:
tr.withLatestFrom(ox)((_,x) => f(x)) merge problem.map(_ => null)