我想要连接冷和热的可观察量。也就是说,得到的observable应该首先发出冷可观察的结果,然后是热的可观察结果。同时,我希望订阅第二个observable,这很热,在订阅第一个发生的同时发生,否则我会错过它的一个重要事件。
这与merge
的行为非常相似。但是我想保证,在merge
不能保证的情况下,热的观察者不会推动任何东西。什么是正确的方法呢?
答案 0 :(得分:2)
根据您的需要,使用Replay
或PublishLast
运算符。每个都有一个接受选择器功能的重载。
例如:
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(你的热观察对象)。如果你需要延迟热观察的重要数据,你别无选择。