Concat操作符语义,但立即订阅所有不依赖的可观察对象



我想连接一个冷的和一个热的观察对象。也就是说,产生的可观测对象应该先发射冷可观测对象的结果,然后是热可观测对象的结果。同时,我希望订阅第二个可观察对象,也就是在订阅第一个可观察对象的同时发生,否则我就会错过一个重要的事件。

看起来和merge很相似。但是我想保证热观测在冷观测完成之前不会推动任何东西,merge不能保证。怎样才能解决这个问题呢?

根据您的需要使用ReplayPublishLast操作符。每个都有一个接受选择器函数的重载。

例如:

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

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

然而,我很好奇你说的hot到底是什么意思。如果你的hot observable在你订阅之前没有生成值,那么从技术上讲,它就是cold。如果你的可观察对象确实是hot,那么在创建这个查询时,你可能已经错过了这个值。虽然,它可能已经隐式缓冲了(例如,如果它是由Observable.FromAsyncPattern创建的),在这种情况下,只需像普通一样将序列连接起来。
var coldThenHot = cold.Concat(hot);

如果你不想错过热门可观察对象以前的数据,有一个ReplaySubject就是这样做的:一旦你订阅了它,它就会把以前的元素推送给订阅者,这看起来确实是你需要的。

所以你要做的是订阅冷观察对象,当它完成(onCompleted)时,只需订阅你的ReplaySubject(你的热观察对象)。如果你需要延迟你的热门可观察对象的重要数据,你没有选择使用一些缓冲。

相关内容

  • 没有找到相关文章

最新更新