RXScala中热和冷可观察对象有什么区别?

5

我知道在C#的上下文中,热和冷的可观察对象之间的差异已经被讨论过了,然而我完全不懂C#,也不理解Lee Campbell所引用的代码示例。

我正在使用RXScala库在Scala中工作。在Scala中,热和冷的可观察对象是什么,如何使用RXScala实现它们?


2
你可能想阅读我的博客文章热和冷的Observables。我很少使用代码示例,几乎完全是对理论的深入探讨。 - Dave Sexton
1个回答

6

冷Observable

冷Observable是在被订阅时开始产生值的Observable。

它们是被动的流,在请求时才开始发布数据。

以下是一些示例:

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个点击事件,并继续发出此后的点击事件。

这是非常清晰的解释。谢谢! - jhegedus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接