只有在另一个 Observable 接收到元素后才订阅 Observable

Subscribe to Observable only after another Observable has received element

我试图在一个地方声明我的所有订阅,没有任何中间中继或触发器。这就是我想要实现的目标。

我有一个 Signal<X>,只有在其他所有内容都已加载并且这个东西工作正常后,它才会开始接收值。但现在我需要介绍另一个 Observable<Y>,当我订阅时,它会立即开始发出值,因为它正在从数据库中获取数据。这有点问题,因为我的 UI 还没有准备好显示结果,它只会在 Signal<X> 发出第一个值时准备好。在此之后我想收到每个值 Observable<Y> 将收到。

我尝试使用 skipUntil,没问题,但我丢失了 Observable<Y> 的第一个元素。 switchLatest 也不是很好的匹配。我也在研究 amb,但这也不会给我正确的结果,因为它订阅了两个序列,而这不是我需要的。

我的问题是:是否有可能只有在原始Observable收到一个值后,才能订阅其他Observable?并保持此订阅有效,以便它对新值做出反应。

听起来您只需要一个简单的 flatMap 或其衍生物之一。很大程度上取决于 X 和 Y 发射的频率以及 X 第一次发射后您想做什么。

您可以通过阅读 this article 了解更多信息,但下面的弹珠图是一个不错的总结(它们假定默认的“冷”或惰性可观察性。如果 y 是热的,那么情况就不同了.):

x.flatMap { _ in y }

x   +---1---2---3---|
y       +--A--B--C--|
y           +--D--E--F--|
y               +--G--H--J--|
--
    +------A--BD-CEG-FH--J--|

x.flatMapFirst { _ in y }

x   +---1---2---3---|
y       +--A--B--C--|
--
    +------A--B--C--|

x.flatMapLatest { _ in y }

x   +---1---2---3---|
y       +--A
y           +--D
y               +--G--H--J--|
--
    +------A---D---G--H--J--|

x.concatMap { _ in y }

x   +---1---2---3---|
y       +--A--B--C--|
y                   +--D--E--F--|
y                               +--G--H--J--|
--
    +------A--B--C-----D--E--F-----G--H--J--|

这完全取决于您想要的行为。