可以从期货中观察 - 从多个线程开始

时间:2016-03-12 15:44:09

标签: scala rx-java observable rx-scala

我想根据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,但我在文档中找不到类似的示例。

1 个答案:

答案 0 :(得分:1)

The Observable Contract

  

Observables必须连续向观察者发出通知(不在   平行)。他们可能会从不同的线程发出这些通知,   但必须有一个正式发生在之前的关系   通知。

查看Serialize

  

Observable可以调用其观察者的方法   异步,也许来自不同的线程。这可以做到这一点   一个Observable违反了Observable合同,因为它可能会尝试   在其OnNext之一之前发送OnCompleted或OnError通知   通知,或者它可能从两个发出OnNext通知   不同的线程同时发生。 你可以强迫这样的Observable   通过对其应用Serialize运算符来表现良好和同步。