Rx java 链独立观测值

Rx java 链独立观测值,rx-java,Rx Java,我想做类似的事情: 我有3个休息电话。第一个反馈给第二个反馈。但是,第三次通话中没有任何内容。我只需要确保它在第二个之后运行。因此,我在这里寻找类似于链的方法: result1Observable.subscribe(new Observer<result1>() { @Override public void onNext(result1 firstRestCallResult) { restCall2(firstRestCallResult).chain(

我想做类似的事情:

我有3个休息电话。第一个反馈给第二个反馈。但是,第三次通话中没有任何内容。我只需要确保它在第二个之后运行。因此,我在这里寻找类似于链的方法:

result1Observable.subscribe(new Observer<result1>() {
    @Override public void onNext(result1 firstRestCallResult) {
        restCall2(firstRestCallResult).chain(restCall3);
    }
}
因为restCall3可能不会返回任何内容,所以通常的map、flatMap等操作符可能会有点棘手—类型不会对齐

有点难看,但可能会使用mergeWith操作符。restCall3只调用onCompleted,不发出任何值。将事物保持在可观察的链中应确保如果任何操作出错或未能完成,整个链将出错或未能完成,包括RESTCALL 3

[注意:我实际上没有尝试前面的代码]

我假设restCall3成功完成对您来说很重要。如果您不特别在意,您可能会将前两个观测值平面映射并使用doOnCompleted,并且Rx应该确保只有在前面两个观测值都成功完成时才会调用它

public Observable<UserStatus> execChain() {
    return login()
            .flatMap(responseBody -> getUserStatus(responseBody)
                    .mergeWith(restCall3()));
}


public Observable<ResponseBody> login() {
    ...
}

public Observable<UserStatus> getUserStatus(ResponseBody responseBody) {
    ...
}

public <T> Observable<T> restCall3() {
    return Observable.create(new Observable.OnSubscribe<T>() {
        @Override
        public void call(Subscriber<? super T> subscriber) {
            //execute blocking call
            performRestCall();
            subscriber.onCompleted();
        }
    });
}