如何在不嵌套调用的情况下串行链接执行两个独立的 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 的最后一个实例。当您需要切换到不同的流时,这可能很有用。