RXScala 中的冷热可观察量有什么区别?
What is the difference between hot and cold observables in RXScala?
我知道在 C# 的上下文中,热和冷 observable 之间的区别是 previously discussed on Stack Overflow,但是我根本不了解 C#,也不理解 Lee Campbell 提到的代码示例。
我在 Scala 工作,使用 RXScala 库。 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@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
被制成可以称为 warm 可观察的东西:
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 次点击,并在之后继续发出点击。
我知道在 C# 的上下文中,热和冷 observable 之间的区别是 previously discussed on Stack Overflow,但是我根本不了解 C#,也不理解 Lee Campbell 提到的代码示例。
我在 Scala 工作,使用 RXScala 库。 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@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
被制成可以称为 warm 可观察的东西:
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 次点击,并在之后继续发出点击。