说我想将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
是一个实际上并不对应于观察者的“元素”的情况时,我不明白如何映射物化的可观察量。答案 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
),将会应用此未来的每个类似地图的操作。