给定基于前一个和传入事件无限生成新值的计算,也可能失败,这是获得两个Observable
s 的最佳方法:
- 可能是无限的,对于成功的转换,
- 用于错误报告?
细节
我正在尝试对由 ScalaFX GUI 中的事件更改的状态进行建模,并且第一次尝试使用 RXScala。简化事情:
trait State {
def computeNext(basedOn: Any): State
}
sealed trait UserEvent // Has some case classes
class StateProcessor(initialState: State, events: Observable[UserEvent]) {
...
}
这个想法是创建一个Observable[State]
给定的初始状态并根据事件更改为下一个状态。很简单:
val observableState = events.scan(initialState){(state, ev) =>
// compute and return next state
state computeNext ???
}
现在问题其实是计算下一个状态涉及到I/O,可能会失败,所以computeNext要返回Try[State]
trait State {
def computeNext(basedOn: Any): Try[State]
}
现在很明显,我不能再使用scan
了。通常我想要两个Observable
s:
class StateProcessor(initialState: State, events: Observable[UserEvent]) {
val observableState: Observable[State] = ???
val observableExc: Observable[Exception] = ???
}
有一个规则,如果Try[State]
是失败,observableState
就不会发出任何东西,也不会报告错误。下一个状态基于上一次成功的计算。
解决这种情况的最优雅的方法是什么?