Concat运算符语义,但是立即订阅所有不可见的observable

时间:2014-07-07 09:17:43

标签: reactive-programming rx-java

我想要连接冷和热的可观察量。也就是说,得到的observable应该首先发出冷可观察的结果,然后是热的可观察结果。同时,我希望订阅第二个observable,这很热,在订阅第一个发生的同时发生,否则我会错过它的一个重要事件。

这与merge的行为非常相似。但是我想保证,在merge不能保证的情况下,热的观察者不会推动任何东西。什么是正确的方法呢?

2 个答案:

答案 0 :(得分:2)

根据您的需要,使用ReplayPublishLast运算符。每个都有一个接受选择器功能的重载。

例如:

var coldThenHot = hot.PublishLast(cold.Concat);

订阅coldThenHot会导致PublishLast首先调用选择器,从而创建Concat查询。然后它订阅它和您的 hot 可观察对象。 hot observable中的最后一个值是缓冲的。当 cold observable完成时,序列将继续缓冲值,或者只是保持静默直到最后一个值到达。

但是,我很好奇 hot 到底是什么意思。如果 hot observable在您订阅之前没有生成值,那么technically it's cold。如果您的observable真的是 hot ,那么在创建此查询时您可能已经错过了该值。虽然它可能已经隐式缓冲(例如,如果它是由Observable.FromAsyncPattern创建的),在这种情况下只需像正常一样连接序列。

var coldThenHot = cold.Concat(hot);

答案 1 :(得分:1)

如果您不想错过hot observable中的先前数据,那么ReplaySubject就是这样做的:只要您订阅它,它就会向订阅者推送以前的元素,看起来像你需要的东西。

所以你需要做的就是订阅冷可观察对象,当它完成时(onCompleted)只需订阅你的ReplaySubject(你的热观察对象)。如果你需要延迟热观察的重要数据,你别无选择。