1

私はflatMap一連の HTTP 呼び出しを実行して、ユーザーの登録、プロファイルの取得、およびその他のことを行う を持っています。エラーのどの段階で発生したかに応じて、特定のエラー メッセージで通知onErrorしたいと思います。登録は成功したのかもしれませんが、作成したプロファイルを取得できませんでした。エラーが発生すると、後続のすべての呼び出しを停止するように、これをどのように達成できますか?subscriptionflatMapflatMap

Observablemyとの疑似コードを次に示しますSubscription

Retrofit.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
        }));
4

1 に答える 1

1

これを行うには、少なくとも 2 つの方法があります。

  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);   
            }
        }));
    
于 2015-07-15T22:02:16.923 に答える