【问题标题】:Observable that wraps FromEventPattern while caching the most recent event for new subscribersObservable 包装 FromEventPattern,同时为新订阅者缓存最新事件
【发布时间】:2014-09-09 04:03:32
【问题描述】:

我使用Observable.FromEventPattern 创建了一个可观察对象。我们就叫它fromEvents吧。

我想创建另一个包装 fromEvents 的 observable。我们将其称为第二个可观察对象wrapper

wrapper 被订阅时,它应该:

  1. 发布来自fromEvents 的最新项目(如果有)。
  2. 发布来自fromEvents 的其余项目

显然wrapper 需要维持对fromEvents 的订阅,以便它始终可以访问最近的事件。

我尝试了ReplayPublishPublishLastObservable.Defer 的各种组合,但我从来没有完全得到我想要的结果。

我确信 Rx 有可以满足我需求的运营商,但我只是不确定如何将所有东西放在一起,因为我是新手。

【问题讨论】:

  • 你试过Publish(initialValue) overload吗?其中哪一部分不符合您的需求?
  • 这对我来说似乎是错误的。 goo.gl/M3g8CE 说,“发布使冷的可观察到热。”而且,“任何 .NET 事件都可以通过调用 FromEventPattern 变成一个热的 observable,而无需使用 Publish。”我已经有一个 hot observable。我知道那么多。我想我想要一个冷的可观察对象,它具有从底层可观察对象“产生”最新(缓存)值的副作用。此外,采用初始值的 PublishLast 需要初始值,如果底层的 observable 还没有产生任何东西,我可能还没有。
  • 无论如何,Publish(initValue) 并没有按照我的描述进行。
  • Publish 在热的 observables 上也很有用。这种特殊的重载可以满足您的需求。我将发布一个示例。

标签: system.reactive reactive-programming


【解决方案1】:

我想我已经能够通过这样做得到我想要的:

Events = Observable.FromEventPattern(...).Replay(1).RefCount();

// contrived example
// in my real app the subscription lives for a specific duration
// and Events is exposed as a readonly property
using(Events.Subscribe())
{
     // get most recent or wait for first
    var e = Events.FirstAsync().Wait();
}

【讨论】:

  • 是的Replay(1) 可能比Publish(null).Where(e => e != null) 更好。做同一件事的方法太多了:)
【解决方案2】:

使用 Publish 重载的示例,该重载在幕后使用 BehaviorSubject 来跟踪最近的事件。

var fromEvents = Observable.FromEventPattern(...);
var published = fromEvents.Publish(null);
// subscribe to this one
var wrapper = published.Where(e => e != null);
// start collecting values
var subscription = published.Connect();

wrapper.Subscribe(...);

【讨论】:

  • 感谢您的示例。我想我已经让它以一种更简单的方式工作了。请查看我的回答,如果有任何我不知道的陷阱,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多