我想连接冷和热的可观察量 . 也就是说,得到的observable应该首先发出冷可观察的结果,然后是热的可观察结果 . 同时,我希望订阅第二个observable,即热门,在第一个订阅发生的同时发生,否则我会错过它的一个重要事件 .
这与 merge 会做的非常相似 . 但是我想保证热的观察者在冷的完成之前不会推动任何东西,而这并不能保证 . 什么是正确的方法?
merge
根据您的需要使用 Replay 或 PublishLast 运算符 . 每个都有一个接受选择器功能的重载 .
Replay
PublishLast
例如:
var coldThenHot = hot.PublishLast(cold.Concat);
订阅 coldThenHot 会导致 PublishLast 首先调用选择器,从而创建 Concat 查询 . 然后它订阅它和你的热观察 . hot observable中的最后一个值是缓冲的 . 当cold observable完成时,序列继续缓冲值,或者只是保持静默直到最后一个值到达 .
coldThenHot
Concat
但是,我很好奇你到底是什么意思 . 如果您的热点可观察量在您订阅之前未生成值,则technically it's cold . 如果您的observable真的很热,那么在创建此查询时您可能已经错过了该值 . 虽然,它已经隐式缓冲了(例如,如果它是由Observable.FromAsyncPattern创建的),在这种情况下只需像正常一样连接序列 .
var coldThenHot = cold.Concat(hot);
如果您不想错过hot observable中的先前数据,那么ReplaySubject就是这样做的:只要您订阅它,它就会向订阅者推送以前的元素,这看起来就像您需要的那样 .
所以你要做的就是订阅冷可观察对象,当它完成时(onCompleted)只需订阅你的ReplaySubject(你的热观察对象) . 如果您需要延迟热观察的重要数据,则无法选择缓冲 .
2 回答
根据您的需要使用
Replay
或PublishLast
运算符 . 每个都有一个接受选择器功能的重载 .例如:
订阅
coldThenHot
会导致PublishLast
首先调用选择器,从而创建Concat
查询 . 然后它订阅它和你的热观察 . hot observable中的最后一个值是缓冲的 . 当cold observable完成时,序列继续缓冲值,或者只是保持静默直到最后一个值到达 .但是,我很好奇你到底是什么意思 . 如果您的热点可观察量在您订阅之前未生成值,则technically it's cold . 如果您的observable真的很热,那么在创建此查询时您可能已经错过了该值 . 虽然,它已经隐式缓冲了(例如,如果它是由Observable.FromAsyncPattern创建的),在这种情况下只需像正常一样连接序列 .
如果您不想错过hot observable中的先前数据,那么ReplaySubject就是这样做的:只要您订阅它,它就会向订阅者推送以前的元素,这看起来就像您需要的那样 .
所以你要做的就是订阅冷可观察对象,当它完成时(onCompleted)只需订阅你的ReplaySubject(你的热观察对象) . 如果您需要延迟热观察的重要数据,则无法选择缓冲 .