只有在另一个 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--|
这完全取决于您想要的行为。
我试图在一个地方声明我的所有订阅,没有任何中间中继或触发器。这就是我想要实现的目标。
我有一个 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--|
这完全取决于您想要的行为。