Java 我如何在不嵌套调用的情况下,连续链接两个独立的观察对象?
使用RxJava,我有一个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
可观察的
和一个可观察的
。我想在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
,它就会变得难看。如何将语法“展开”为更流畅的语法-获得更像javascriptPromise.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 */);