我正在使用rxjava 2进行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.unbookclass。我如何始终致电此服务。unbookClass,仅致电服务。GETRESEVERVCLASSES如果我没有类ID(FitClass.Getaid((== null(无需重复第二个呼叫的代码。
我建议将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 */);
对于 Maybe
和 switchIfEmpty
来说,看起来很好。如果返回的值是非编号,则fromCallable
方法将返回1个值,如果返回的项目为null
,则只需完成即可。如果源没有发射物品,则可以使用switchIfEmpty
来提供替代方案(在这种情况下(。让您对unbookClass
的改装呼叫正在返回单个,您的代码看起来像 -
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(...);