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

时间:2018-04-27 13:28:58

标签: java android retrofit rx-java2

我正在使用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 不重复第二次调用的代码。

2 个答案:

答案 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)

看起来很适合Maybewhite-space: pre-wrap; 。如果返回的值为非null,则switchIfEmpty方法将返回1值,如果返回的项为fromCallable,则仅返回完成。如果源未发出项,则null可用于提供备用(在这种情况下为Single或Maybe)。假设您对switchIfEmpty的改装调用返回单个,您的代码看起来就像 -

unbookClass