如何在不嵌套调用的情况下串行链接执行两个独立的 Observables?
How do I chain execution two indepentent Observables serially without nesting the calls?
使用 RxJava 我有一个 Observable<A>
和一个 Observable<B>
。我想在 A
的第一个(也是唯一一个)元素发出后立即开始订阅 B
。我知道我可以像这样链接它:
final Observable<A> obsOfA;
final Observable<B> obsOfB;
obsOfA.subscribe(new Action1<A>() {
@Override
public void call(A a) {
obsOfB.subscribe(...)
}
});
..但这会导致嵌套语法,一旦我们引入 Observable<C>
就会变得难看。我怎样才能 "unwrap" 语法更流畅 - 得到一个更像 javascript Promise.then()
-flow 的语法?
你应该使用 flatMap
:
obsOfA.flatMap(new Func1<A, Observable<B>>() {
@Override
public Observable<B> call(A a) {
return obsOfB;
}
})
.subscribe(/* obsOfB has completed */);
每次obsOfA
调用onNext(a)
,call
都会用这个值a
执行。
您可以使用 switch
, combined with map
in switchMap
:
obsOfA.switchMap(i -> obsOfB)
.subscribe(/* obsOfB has completed */);
这和merge
in flatMap
几乎一样,只要obsOfA
只产生1个值,但是当它产生更多的值时,flatmap
会合并它们,而switch
只会订阅 obsOfB
的最后一个实例。当您需要切换到不同的流时,这可能很有用。
使用 RxJava 我有一个 Observable<A>
和一个 Observable<B>
。我想在 A
的第一个(也是唯一一个)元素发出后立即开始订阅 B
。我知道我可以像这样链接它:
final Observable<A> obsOfA;
final Observable<B> obsOfB;
obsOfA.subscribe(new Action1<A>() {
@Override
public void call(A a) {
obsOfB.subscribe(...)
}
});
..但这会导致嵌套语法,一旦我们引入 Observable<C>
就会变得难看。我怎样才能 "unwrap" 语法更流畅 - 得到一个更像 javascript Promise.then()
-flow 的语法?
你应该使用 flatMap
:
obsOfA.flatMap(new Func1<A, Observable<B>>() {
@Override
public Observable<B> call(A a) {
return obsOfB;
}
})
.subscribe(/* obsOfB has completed */);
每次obsOfA
调用onNext(a)
,call
都会用这个值a
执行。
您可以使用 switch
, combined with map
in switchMap
:
obsOfA.switchMap(i -> obsOfB)
.subscribe(/* obsOfB has completed */);
这和merge
in flatMap
几乎一样,只要obsOfA
只产生1个值,但是当它产生更多的值时,flatmap
会合并它们,而switch
只会订阅 obsOfB
的最后一个实例。当您需要切换到不同的流时,这可能很有用。