物化可观察的模式匹配地图

时间:2014-11-30 00:38:15

标签: scala scala-collections

说我想将Observable[T]转换为Observable[Try[T]]。我希望对具体化的原始可观察对象进行模式匹配,但我不知道要为OnCompleted()返回什么:

obs.materialized map {
  case OnNext(v) => Success(v)
  case OnError(t) => Failure(t)
  case OnCompleted() => // What do I return here?
}
  • 一般来说,当OnCompleted是一个实际上并不对应于观察者的“元素”的情况时,我不明白如何映射物化的可观察量。

1 个答案:

答案 0 :(得分:2)

In Rx Java materialized Observable is a list of notifications - OnCompleted / OnError是最后也是唯一一个通知。我认为RxScala也是如此。将每封邮件设置为Success似乎不正确 - 因为上一次Success / Failure整个序列的成功/失败,所以它更好仅对Try / OnError消息使用OnCompleted(但它将是Observable[T] => Observable[Msg[T]]):

trait Msg[T]
case class Data[T](d: T) extends Msg[T]
case class End[T](t: Try[Observable[T]]) extends Msg[T]
obs.materialize map {
  case OnNext(v) => Data(v)
  case OnError(t) => End(Failure(t))
  case OnCompleted() => End(Success(obs))
}

无论如何,您无法(从逻辑角度)将Observable[T]转换为Observable[Try[T]],直到收到上一封通知为止,实际上您只能将其转换为Future[Observable[Try[T]]Future[Observable[T]] {1}}(因为Observable为其所有元素完成或失败):

 val p = promise[Observable[Notification[T]]]

 obs.materialize flatMap {
  case OnNext(v) => Some(v)
  case OnError(t) =>  p.fail(t); None
  case OnCompleted() => p.complete(obs); None
 }

 p.future

请注意,在收到所有通知后(例如doOnTerminate),将会应用此未来的每个类似地图的操作。