我想根据Observable
列表的结果实时生成Futures
。
在最简单的情况下,假设我有一个我正在使用Future.sequence
运行的未来列表,而我只是通过Observable
监控他们的进度,每次完成时都会告诉我。我基本上是这样做的:
def observeFuturesProgress(futs: List[Future[Int]]) : Observable[String] = {
Observable[String](observer => {
val loudFutures: List[Future[Int]] = futs.map(f => {
f onComplete {
case Success(a) => observer.onNext(s"just did $a more")
case Failure(e) => observer.onError(e)
}
f
})
Future.sequence(loudFutures) onComplete {
case Success(_) => observer.onCompleted()
case Failure(e) => observer.onError(e)
}
})
}
这在我的测试环境中运行良好。但我刚刚读到不应该从不同的线程调用onNext
,至少不要小心没有重叠的调用。建议的解决方法是什么?似乎Observables
的许多实际用途都需要从这样的异步代码中调用onNext
,但我在文档中找不到类似的示例。
答案 0 :(得分:1)
Observables必须连续向观察者发出通知(不在 平行)。他们可能会从不同的线程发出这些通知, 但必须有一个正式发生在之前的关系 通知。
Observable可以调用其观察者的方法 异步,也许来自不同的线程。这可以做到这一点 一个Observable违反了Observable合同,因为它可能会尝试 在其OnNext之一之前发送OnCompleted或OnError通知 通知,或者它可能从两个发出OnNext通知 不同的线程同时发生。 你可以强迫这样的Observable 通过对其应用Serialize运算符来表现良好和同步。