首页 文章

Concat运算符语义,但是立即订阅所有不可见的observable

提问于
浏览
1

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

这与 merge 会做的非常相似 . 但是我想保证热的观察者在冷的完成之前不会推动任何东西,而这并不能保证 . 什么是正确的方法?

2 回答

  • 1

    根据您的需要使用 ReplayPublishLast 运算符 . 每个都有一个接受选择器功能的重载 .

    例如:

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

    订阅 coldThenHot 会导致 PublishLast 首先调用选择器,从而创建 Concat 查询 . 然后它订阅它和你的热观察 . hot observable中的最后一个值是缓冲的 . 当cold observable完成时,序列继续缓冲值,或者只是保持静默直到最后一个值到达 .

    但是,我很好奇你到底是什么意思 . 如果您的热点可观察量在您订阅之前未生成值,则technically it's cold . 如果您的observable真的很热,那么在创建此查询时您可能已经错过了该值 . 虽然,它已经隐式缓冲了(例如,如果它是由Observable.FromAsyncPattern创建的),在这种情况下只需像正常一样连接序列 .

    var coldThenHot = cold.Concat(hot);
    
  • 2

    如果您不想错过hot observable中的先前数据,那么ReplaySubject就是这样做的:只要您订阅它,它就会向订阅者推送以前的元素,这看起来就像您需要的那样 .

    所以你要做的就是订阅冷可观察对象,当它完成时(onCompleted)只需订阅你的ReplaySubject(你的热观察对象) . 如果您需要延迟热观察的重要数据,则无法选择缓冲 .

相关问题