链接独立的 Observable

Chaining Independent Observables

我喜欢做类似的事情:http://joluet.github.io/blog/2014/07/07/rxjava-retrofit/

我有 3 个休息电话。第一个馈入第二个。但是,没有任何内容进入第 3 次通话。我只需要确保它在第二个之后运行。所以我在这里寻找类似 "chain" 方法的东西:

result1Observable.subscribe(new Observer<result1>() {
    @Override public void onNext(result1 firstRestCallResult) {
        restCall2(firstRestCallResult).chain(restCall3);
    }
}

因为您的 restCall3 可能不会 return 任何东西,所以通常的 mapflatMap 等运算符可能有点棘手 -类型不会排队。

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

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();
        }
    });
}

[注:上面的代码我没实际试过]

我假设 restCall3 成功完成对您很重要。如果你不是特别在意,你可能 flatMap 前两个 Observables 并使用 doOnCompleted 并且 Rx 应该确保它 only 被调用如果前面的两个 Observables 都成功完成。