我正在使用RxJava 2来执行API的调用。 我必须打电话取消预订课程。
但我必须要做或不做以前的一次电话,以获取缺失的信息。
这是这样的:
if classId not exists
get classId
then unbook class
else
unbook class
我不想重复unbook类代码。
以下是简化的代码:
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.unbookClass。 如果我没有类id(fitClass.getAid()== null)我怎么能总是调用这个service.unbookClass并且只调用service.getReservedClasses 不重复第二次调用的代码。
答案 0 :(得分:0)
我建议将id的实际来源分成它自己独立的observable。也许是这样的:
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 */);
答案 1 :(得分:0)
看起来很适合Maybe
和white-space: pre-wrap;
。如果返回的值为非null,则switchIfEmpty
方法将返回1值,如果返回的项为fromCallable
,则仅返回完成。如果源未发出项,则null
可用于提供备用(在这种情况下为Single或Maybe)。假设您对switchIfEmpty
的改装调用返回单个,您的代码看起来就像 -
unbookClass