我想连接一个冷的和一个热的观察对象。也就是说,产生的可观测对象应该先发射冷可观测对象的结果,然后是热可观测对象的结果。同时,我希望订阅第二个可观察对象,也就是在订阅第一个可观察对象的同时发生,否则我就会错过一个重要的事件。
看起来和merge
很相似。但是我想保证热观测在冷观测完成之前不会推动任何东西,merge
不能保证。怎样才能解决这个问题呢?
根据您的需要使用Replay
或PublishLast
操作符。每个都有一个接受选择器函数的重载。
var coldThenHot = hot.PublishLast(cold.Concat);
订阅coldThenHot
导致PublishLast
首先调用选择器,创建Concat
查询。然后它订阅它和你的hot可观察对象。hot可观察对象中的最后一个值被缓冲。当cold可观察对象完成后,该序列继续使用缓冲的值,或者保持静默,直到最后一个值到达。
var coldThenHot = cold.Concat(hot);
如果你不想错过热门可观察对象以前的数据,有一个ReplaySubject就是这样做的:一旦你订阅了它,它就会把以前的元素推送给订阅者,这看起来确实是你需要的。
所以你要做的是订阅冷观察对象,当它完成(onCompleted)时,只需订阅你的ReplaySubject(你的热观察对象)。如果你需要延迟你的热门可观察对象的重要数据,你没有选择使用一些缓冲。