RXScala中的热和冷可观测量有什么区别?

jhe*_*dus 5 scala system.reactive

我知道热和冷可观察量之间的差异之前已经在C#的上下文中讨论了Stack Overflow,但我根本不了解C#并且不理解Lee Campbell所指的代码示例.

我在Scala工作,使用RXScala库.什么是Scala中的冷热可观测量,以及它们如何使用RXScala实现?

pha*_*dej 6

冷观察

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

被动的流并根据请求开始发布.

一些例子:

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
}
Run Code Online (Sandbox Code Playgroud)

热门观察

无论订阅如何,都处于活动状态并发布的流.

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

在许多应用程序loggedInUsers中,可以将其称为温暖可观察的东西:

val loggedInUsers = updateTriggers.concatMap { _ => 
  fetchLoggedUsersFromDb
}.replay(1)
Run Code Online (Sandbox Code Playgroud)

当上次触发时,此流的subriber将立即获得一个值,即已记录的用户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
Run Code Online (Sandbox Code Playgroud)

但是之间有一些东西:

// Observable that will replay at most 10 items emitted by `hot`
val warm = hot.replay(10) 
Run Code Online (Sandbox Code Playgroud)

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