2

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

这看起来与会做的事情非常相似merge。但我想保证热的 observable 在冷的 observable 完成之前不会推送任何东西,这merge并不能保证。解决这个问题的正确方法是什么?

4

2 回答 2

2

根据您的需要使用Replayor运算符。PublishLast每个都有一个接受选择器函数的重载。

例如:

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

订阅coldThenHot原因PublishLast以首先调用选择器,创建Concat查询。然后它订阅它和你的hot observable。hot observable中的最后一个值被缓冲。当的observable 完成时,序列继续使用缓冲的值,或者只是保持沉默,直到最后一个值到达。

但是,我很好奇您所说的hot到底是什么意思。如果您的hot observable 在您订阅之前不会产生值,那么从技术上讲它是cold。如果您的 observable 确实是hot,那么您可能在创建此查询时已经错过了该值。虽然,它可能已经被隐式缓冲(例如,如果它是由Observable.FromAsyncPattern创建的),在这种情况下,只需像平常一样连接序列。

var coldThenHot = cold.Concat(hot);
于 2014-08-28T02:57:02.597 回答
1

如果您不想错过来自 hot observable 的先前数据,那么ReplaySubject正是这样做的:一旦您订阅它,它就会将之前的元素推送给订阅者,这看起来就像您在这里需要的一样。

所以你要做的就是订阅冷的 observable,当它完成时(onCompleted)只需订阅你的 ReplaySubject(你的 hot observable)。如果您需要延迟 hot observable 的重要数据,您别无选择。

于 2014-07-08T09:37:30.770 回答