我知道在C#上下文中,热的和冷的可观察变量之间的区别一直是previously discussed on Stack Overflow,但是我一点都不了解C#,也不了解Lee Campbell所引用的代码示例。

我正在使用RXScala库在Scala中工作。 Scala中的冷热观测是什么,如何使用RXScala实施?

最佳答案

冷观测

冷可观察性是指在订阅时开始产生价值的可观察性。

被动流,并根据请求开始发布。

一些例子:

import rx.lang.scala._
import org.joda.time._

val onetwothree = Observable.just(1, 2, 3) // when subscribed each subscriber will get 1, 2, and 3
// scala> onetwothree.subscribe(println(_))
// 1
// 2
// 3
// res1: rx.lang.scala.Subscription = rx.lang.scala.Subscription$$anon$2@11be372a

// When subscribed will get one event with current DateTime
val currentTime = Observable.defer {
  Observable.just(DateTime.now)
}
// scala> currentTime.subscribe(println(_))
// 2015-01-19T14:13:37.333+02:00

// scala> currentTime.subscribe(println(_))
// 2015-01-19T14:13:38.742+02:00

// scala> currentTime.subscribe(println(_))
// 2015-01-19T14:13:40.448+02:00

// And this one is tricky.
val loggedInUsers = Obserable.defer {
  fetchLoggedUsersFromDb
}


热观测

活动和发布的流,无论订阅如何。

自然的例子来自UI编程:鼠标单击流。无论是否订阅流,都会产生点击。

在许多应用程序中,将loggedInUsers制成可以被称为“温暖可观察”的东西:

val loggedInUsers = updateTriggers.concatMap { _ =>
  fetchLoggedUsersFromDb
}.replay(1)


上次触发updateTriggers时,此流的子订阅者将立即获得一个值,即已记录的用户。以及连续的更新。



温暖的观测

val hot = mouseClicks

// Observable that will replay all of its items and notifications to any future Observer
// i.e. all mouseClicks from the time point we called `.replay`
val cold = hot.replay


但是介于两者之间:

// Observable that will replay at most 10 items emitted by `hot`
val warm = hot.replay(10)


当我们订阅warm时,它将立即发出最后10次点击,并在此之后继续发出点击。

07-24 15:03