RxJava-在第一个调用是有条件的情况下进行两个调用

RxJava-在第一个调用是有条件的情况下进行两个调用,java,android,retrofit,rx-java2,Java,Android,Retrofit,Rx Java2,我正在使用RXJava2进行API调用。 我得打个电话取消订课 但我必须做或不做一个以前的电话,以获得丢失的信息 是这样的: if classId not exists get classId then unbook class else unbook class 我不想重复未绑定的类代码 以下是简化的代码: FitnessDataService service = RetrofitInstance.getRetrofitInstance().create(FitnessDa

我正在使用RXJava2进行API调用。 我得打个电话取消订课

但我必须做或不做一个以前的电话,以获得丢失的信息

是这样的:

if classId not exists
   get classId
   then unbook class
else
   unbook class
我不想重复未绑定的类代码

以下是简化的代码:

FitnessDataService service = RetrofitInstance.getRetrofitInstance().create(FitnessDataService.class);
        // if we don't have the aid of class (reserved), we get it from the reserved classes


        if (fitClass.getAid() == null) {
            service.getReservedClasses(FitHelper.clientId)
                    .flatMap(reservedClasses ->
                    {
                        // get the class ID from reserved classes
                         ...
                        return service.unbookClass(fitClass.getAid());
                    }).subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(response -> {
                                // success
                            }, err -> 
                                // error
        } else {
            service.unbookClass(fitClass.getAid())
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(response -> {
                                // success
                            }, err -> 
                                // error
        }
如您所见,service.unbokClass是重复的。 如果我没有类id(fitClass.getAid()==null),如何始终调用此service.unbokClass并仅调用service.getReservedClass
无需对第二次调用重复代码。

我建议将id的实际来源分离为它自己单独的可观察对象。可能是这样的:

Observable<Long> idObservable;
if (fitClass.getAid() == null) {
    idObservable = service.getReservedClasses(FitHelper.clientId)
        .map({ reservedClasses ->
            /* Get the Id and do stuff with it */
            return fitClass.getAid();
        });
} else {
    idObservable = Observable.just(fitClass.getAid());
}

idObservable.flatMap({ aid -> service.unbookClass(aid) })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(/* TODO */);
可观察到的i可观察到的;
if(fitClass.getAid()==null){
idObservable=service.getReservedClass(FitHelper.clientId)
.map({ReservedClass->
/*拿到身份证,用它做些事情*/
返回fitClass.getAid();
});
}否则{
idObservable=Observable.just(fitClass.getAid());
}
idObservable.flatMap({aid->service.unbokClass(aid)})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
。认购(/*TODO*/);
看起来很适合使用and
开关ifempty
。如果返回的值不为null,则
fromCallable
方法将返回1个值,如果返回的项为
null
,则该方法将仅返回完成<如果源未发出项目,则代码>开关IFEMPTY可用于提供备用(单个或在本例中可能是单个)。如果您对
unbokClass
的改装调用返回一个,那么您的代码看起来像--


我已经实现了这一点,效果很好。谢谢:)刚刚将.map更改为.flatMap,因为我只想从reservedClasses列表中获取一个值。感谢您让我了解Maybe操作符和
开关ifempty
。尽管如此,我在实现这一点上遇到了一些麻烦。我对
unbokClass
的改装调用返回一个可观察(
observeable
)。适应是否简单?是的,只需在改装界面中返回
Single
。大多数改装调用只返回一个元素,然后调用
onComplete
,这与单个
相同
谢谢。我将我的改装调用更改为返回
也许
,这样,这种方法效果很好。我想我还可以继续使用
可观察的
,然后使用
.singleElement()
Maybe.fromCallable(() -> fitClass.getAid())
    .switchIfEmpty(service.getReservedClasses(FitHelper.clientId)
                    .flatMap(reservedClasses -> {
                        // ....
                        return fitClass.getAid());
                    }))
    .flatMap(id -> service.unbookClass(id))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(...);