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



我试图在一个地方声明我的所有订阅,并且没有任何中间中继或触发器。以下是我正在努力实现的目标。

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

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

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

它听起来像是一个简单的flatMap或它的一个衍生物。这在很大程度上取决于X和Y发射的频率,以及第一次发射后X要做什么。

你可以通过阅读这篇文章了解更多,但下面的大理石图是一个不错的总结(它们假设默认的"冷"或懒惰可观察。如果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--|

这完全取决于你到底想要什么样的行为。

最新更新