【问题标题】:Create hot observable in Rx from array在 Rx 中从数组创建 hot observable
【发布时间】:2012-07-20 22:05:06
【问题描述】:

我该怎么做?

我有一个代码:

new int[]{1,2,3}.ToObservable().Subscribe(myObserver);

问题是第一次调用是冷可观察的,因此在另一个调用中是这样的:

new int[]{4,5,6}.ToObservable().Subscribe(myObserver);

myObserver 根本不会触发 onNext。显然是因为第一个电话发布了1,2,3, END。我不想让 observable 调用“END”,因为我想稍后继续订阅。有什么功能可以让我轻松做到这一点吗?

【问题讨论】:

  • 哦,BTQ,您要的不是“热”可观察的。您的问题标题有点误导。
  • 顺便说一句,BTQ 是 BTW 的拼写错误。 ;-)

标签: c# system.reactive reactive-programming


【解决方案1】:

你需要做这样的事情:

new int[] { 1, 2, 3, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver); 

new int[] { 4, 5, 6, }
    .ToObservable()
    .Concat(Observable.Never<int>())
    .Subscribe(myObserver);

关键是在 observable 上做一个.Concat(Observable.Never&lt;int&gt;()) 以防止它永远结束。

【讨论】:

  • 谢谢!应该这样做。
  • @Alwyn - 不用担心。只是一个快速警告 - 您需要确保正确处理所有异常,因为它们也会结束任何可观察到的。如果您需要过滤掉异常(这通常是个坏主意),请查看.Materialize().Dematerialize()
  • 如果用户实际获取数组,然后将它们转换为可观察序列,则可能无需担心错误:)
【解决方案2】:

在不知道如何在上下文中使用这些 observables 的情况下,我的第一个建议是在订阅之前 Concat 这两个 observables(或 IEnumerables)。

(new int[]{1,2,3}.ToObservable())
.Concat(new int[]{4,5,6}.ToObservable())
.Subscribe(myObserver)

据我所知,您无法在代码中的 ToObservableSubscribe 调用之间插入任何方法来获得您所追求的行为。可以编写这样的方法,但它不能很好地与库的其余部分配合使用。

【讨论】:

  • Gideon,这不是我正在研究的选项。我没有同时使用这两个列表,事实上它们位于代码的两个不同区域,我不想将它们结合起来。
【解决方案3】:

Fwiw,要将 Cold Observable 变成 Hot Observable,请使用多播:

var obs = new[] {1,2,3}.ToObservable()
    .Multicast(new Subject<int>())

// TODO: Subscribe as many people as you want

obs.Connect();  // Everyone subscribed gets 1,2,3,Completed now

obs.Subscribe(...);  // This guy gets no results

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 2016-03-07
    • 2020-10-26
    • 1970-01-01
    • 2013-12-12
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多