链接独立观察者

时间:2015-10-10 01:02:19

标签: rx-java

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

我有3个休息电话。第一个进入第二个。但是,第三次通话没有任何内容。我只需要确保它在第二次运行后运行。所以我正在寻找像"链"方法在这里:

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

1 个答案:

答案 0 :(得分:0)

因为您的restCall3可能不会返回任何内容,因此通常的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应该确保只有 才会被调用前面的Observables成功完成。