0

给定基于前一个和传入事件无限生成新值的计算,也可能失败,这是获得两个Observables 的最佳方法:

  • 可能是无限的,对于成功的转换,
  • 用于错误报告?

细节

我正在尝试对由 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了。通常我想要两个Observables:

class StateProcessor(initialState: State, events: Observable[UserEvent]) {
  val observableState: Observable[State] = ???
  val observableExc: Observable[Exception] = ???
}

有一个规则,如果Try[State]是失败,observableState就不会发出任何东西,也不会报告错误。下一个状态基于上一次成功的计算。

解决这种情况的最优雅的方法是什么?

4

0 回答 0