1

我正在使用 rx-scala,它是 rx-java 的子项目。我将使用 Scala 语法,希望每个人都能理解。

我遇到了奇怪的行为,我不知道这是错误还是代表我滥用 rx 运算符。

问题陈述

我有一个ox: Observable[X]和一个触发器 observable tr: Observable[()]。我想要一个 observable oy,它是oxusing function的转换f: Function[X,Y],但只有在触发时才会发生,因为f它可能很昂贵。

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

一些备注:

  • ox很热,因为它是 UI 事件的结果。
  • oxprintln正如我通过调试检查的那样,行为正确(值和时间) 。
  • oy在正确的时间开火;它只是使用过时的值ox,当它是一个非空值时。

当前代码

oy = ox.sample(tr).map(f).merge(ox.map(x => null))

上面代码的问题是:它最初可以工作,但一段时间后,当触发 时,troy会应用于. 不改变时,如果我反复触发,结果会更新并最终赶上。foxoxtr

如果我删除mergeto not reset to null,那么一切正常(可能是因为效果看起来不确定)。

问题

我提供的代码有问题。

  1. 我想知道我是否做错了什么。
  2. 我欢迎实现我需要的其他方法。

对于 Jave 人

  • 泛型/类型注释:ox: Observable[X]意味着Observable<X> ox
  • lambdas:x => null意味着x -> null
4

1 回答 1

0

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

tr.withLatestFrom(ox)((_,x) => f(x)) merge problem.map(_ => null)
于 2015-05-27T11:45:08.580 回答