Rx中一个Observer的多个订阅

时间:2010-07-11 01:24:45

标签: .net system.reactive

随着时间的推移,我试图在我的观察者中改进过滤器,我想知道他们最好的做法是什么。

e.g。 myObservable.Where(x=>x.Color=="red").Subscribe();

然后myObservable.Where(x=>x.Color=="blue").Subscribe();

然后将两者合并为一个流,以便在Red OR Blue observables上调用OnNext()

也许它还没有完全点击我发生的事情。

如果我还有myObservable.Where(x=>x.Type=="Car").Subscribe();怎么办?它每次都会继续调用相同的OnNext()方法吗?这对我有什么用处......我可能想要根据哪个订阅调用更新来做出不同的反应,但同时我可能想要平整订阅。

e.g。在上面的场景中,如果颜色是红色,我想写'新的红色物体',如果它是一辆汽车,我想写'新车'。我怎么在Rx中这样做? OnNext,OnError等订阅上有一个重载。但是这也要求Observer也是一个可观察的(主题)..如果我错了,请纠正我。

这对我来说毫无意义..为什么观察到变化的东西也应该是可观察到的?

2 个答案:

答案 0 :(得分:1)

这个怎么样?

myObservable.Where(x=>x.Color=="red" || x.Color == "blue").Subscribe(x=>Console.WriteLine("new {0} object", x.Color));
myObservable.Where(x=>x.Type=="Car").Subscribe(x=>Console.WriteLine("new car"));

杰弗里

答案 1 :(得分:0)

首先,主体是一个观察者,它是在观察到其他可观察物时产生的。在某些情况下,它们可用作“管道”,您甚至可以使用它们构建一种通过渠道进行通信的“代理”形式。

对于你的主要问题:我认为它可能没有点击,因为在你的订阅示例中你遗漏了观察者应该订阅的内容 - 它不能是...订阅(),它必须是.. .Subscribe(观察者)。

您的问题的一个答案是您可以将同一个观察者订阅到多个可观察对象。或者你可以使用Merge。如果你想能够区分它们,那么最简单的方法就是让两个主体观察,做那些特定的事情,然后将观察结果传递给合并。或者,您可以使用“选择”在合并之前标记观察值。