rxjava-在第一个呼叫的情况下进行两个呼叫



我正在使用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 */);

对于 MaybeswitchIfEmpty来说,看起来很好。如果返回的值是非编号,则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(...);

最新更新