如果发生异常,则使flatMap短路

时间:2015-07-15 20:21:10

标签: android retrofit rx-java rx-android

我有flatMap运行一系列HTTP调用来注册用户,检索他们的个人资料以及其他一些事情。我想通知onError subscriptionflatMap的特定错误消息,具体取决于flatMap错误发生的哪个阶段。也许注册成功,但检索创建的配置文件不是。我怎样才能实现这一点,以便我的Observable在发生错误时停止所有后续调用?

以下是我的SubscriptionRetrofit.registerUser() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatMap({ return Retrofit.authenticate(); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatMap({ return Retrofit.retrieveProfile() }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .flatMap({ return Retrofit.retrieveOtherStuff() }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1 { }, new Action1<Throwable>() { // I would like to display the error to my user here })); 的一些伪代码:

{{1}}

1 个答案:

答案 0 :(得分:1)

至少有两种方法可以做到:

  1. 使用doOnError运算符:

    Retrofit.registerUser()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnError(error -> {
            showRegistrationFailedError(error);
        })
        .flatMap({
            return Retrofit.authenticate().doOnError(error -> {
                showAuthenticationFailedError(error);
            });
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1 {
    
        }, new Action1<Throwable>() {
          // do nothing here. all errors are already handled in doOnError methods
        }));
    
  2. 使用onErrorResumeNext运算符:

    Retrofit.registerUser()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .onErrorResumeNext(error -> {
            return Observable.error(new RegistrationFailedException(error));
        })
        .flatMap({
            return Retrofit.authenticate().onErrorResumeNext(error -> {
                return Observable.error(new AuthenticationFailedException(error))
            });
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(value -> {
    
        }, error -> {
            if (error instanceof RegistrationFailedException) {
                showRegistrationFailedError(error);
            }
    
            if (error instanceof AuthenticationFailedException) {
                showAuthenticationFailedError(error);   
            }
        }));