Java 我如何在不嵌套调用的情况下,连续链接两个独立的观察对象?

Java 我如何在不嵌套调用的情况下,连续链接两个独立的观察对象?,java,rx-java,Java,Rx Java,使用RxJava,我有一个可观察的和一个可观察的。我想在A的第一个(也是唯一一个)元素发出后立即开始订阅B。我知道我可以像这样把它拴起来: final Observable<A> obsOfA; final Observable<B> obsOfB; obsOfA.subscribe(new Action1<A>() { @Override public void call(A a) { obsOfB.s

使用RxJava,我有一个
可观察的
和一个
可观察的
。我想在
A
的第一个(也是唯一一个)元素发出后立即开始订阅
B
。我知道我可以像这样把它拴起来:

final Observable<A> obsOfA;
final Observable<B> obsOfB;
obsOfA.subscribe(new Action1<A>() {
        @Override
        public void call(A a) {
            obsOfB.subscribe(...)      
        }
});
最终可观测OBSOA;
最终可观测obsOfB;
obsOfA.subscribe(新操作1(){
@凌驾
公开作废通知(A){
obsOfB.订阅(…)
}
});

…但这将导致嵌套语法,一旦我们引入
Observable
,它就会变得难看。如何将语法“展开”为更流畅的语法-获得更像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.flatMap(新函数1(){
@凌驾
公共可观测呼叫(A){
返回OBSOB;
}
})
。订阅(/*obsOfB已完成*/);
每次
obsOfA
调用
onNext(a)
call
都将使用此值
a

执行,该值可与in:


只要
obsOfA
只产生1个值,这几乎与中相同,但当它产生更多值时,
flatmap
将组合它们,而
switch
将只订阅
obsOfB
的最后一个实例。当您需要切换到不同的流时,这可能很有用。

但是在这种情况下,B后面的函数会在a完成之前开始执行吗?假设B是一个长时间运行的进程,我只想在a的某些条件下执行(我想我现在正在修改原始问题,但如果你知道答案,我将不胜感激)
obsOfB
只有在
obsOfA
调用
onNext
时才会启动。您可以看到在
call
方法中有一个
A
参数。这是由
obsOfA
发出的值。
obsOfA.switchMap(i -> obsOfB)
.subscribe(/* obsOfB has completed */);