给定基于前一个和传入事件无限生成新值的计算,这也可能失败,这是获得两个Observable
的最佳方式:
我试图建模一个由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]
,给定初始状态并根据事件更改为next。很简单:
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
根本不会发出任何内容,也不报告错误。下一个状态基于上次成功计算。
解决这种情况最优雅的方法是什么?