可观察的Rx Scala行为

时间:2015-05-11 06:50:16

标签: scala reactive-programming

以下示例来自我目前正在阅读的有关Observables的书籍之一:

object ObservablesCreate extends App {
  val vms = Observable.create[String] { obs =>
    obs.onNext("JVM")
    obs.onNext("DartVM")
    obs.onNext("V8")
    obs.onCompleted()
    Subscription()
  }
  vms.subscribe(log _, e => log(s"oops - $e"), () => log("Done!"))
}

下面的文字暗示上面的代码片段有一个非常容易理解的同步订阅方法。我的问题是,这不是使用Observables进行异步事件发送的全部目的吗?我的意思是这里与Iterable没有区别。这是为了解释一下来解释的吗?

1 个答案:

答案 0 :(得分:1)

是的,这只是为了解释create工厂方法。在订阅代码中,您将在订阅者订阅时同步生成元素。

但以同样的方式,您可以异步调用onNext,例如当Future结算时:

object ObservablesCreate extends App {
    def future: Future[String] = ???
    val vms = Observable.create[String] { obs =>
        val f = future
        f onComplete {
            case Success(s) => {
                obs.onNext(s)
                obs.onCompleted()
            }
            case Failure(exception) => obs.onError(exception)
        }

        Subscription()
    }

    vms.subscribe(log _, e => log(s"oops - $e"), () => log("Done!"))
}

(对于这种特定情况,使用Observable.from方法将Future转换为Observable

要好得多