【问题标题】:Using the latest value from IObservable使用 IObservable 的最新值
【发布时间】:2011-09-26 12:50:10
【问题描述】:

我有FooBarBaz 类型的三个IObservable。另外,还有一个方法定义为:

void DoWork(Foo foo);

IObservable 在其他地方被定义为Subject,并且OnNext 不时被调用。

只要有新数据可用(由一些 Where 查询定义),我想用最新的 Foo 值调用 DoWork 方法。如果没有生成Foo 值,则不应调用该方法。

最简单的方法是什么?

更具体地说,请参见以下示例。当barbaz 发生变化时,我想打电话给DoWork,最新的foo (f.id == 1):

void Wire(IObservable<Foo> foo, IObservable<Bar> bar, IObservable<Baz> baz)
{
    foo.Where(f => f.Id == 1)
        .Subscribe(f => DoWork(f));
}

【问题讨论】:

  • 而 IObservable 和流之间的关系/交互是 ...
  • 查看我对主题和 OnNext 的编辑。没什么太花哨的
  • 您的意思是当任一 barbaz 发生变化时,您想调用DoWork()
  • 是的,当其中一个发生变化时
  • @kshahar - 你为什么使用Replay

标签: .net c#-4.0 system.reactive


【解决方案1】:

这对我有用:

var ubar = bar.Select(x => Unit.Default);
var ubaz = baz.Select(x => Unit.Default);

ubar.Merge(ubaz)
    .CombineLatest(foo.Where(f => f.Id == 1), (u, f) => f)
    .Subscribe(f => DoWork(f));

【讨论】:

  • @kshahar - 这不是你在问题中要求的吗?
【解决方案2】:

您可以使用Observable class 上的Do extension method 来执行此操作:

IObservable<Foo> filteredList = foos.Where(...);

// Invoke DoWork on each instance of Foo.
filteredList.Do(DoWork);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多