RxJava (Android) - 错误的中间步骤,错误解决后重试

RxJava (Android) - Intermediate step on error, retry after error resolution

我目前正在尝试让自己进入 RxJava。


现在我有以下场景:
我必须对用户进行身份验证。

我需要为此执行的步骤如下:

  1. 尝试使用本地存储的令牌对用户进行身份验证
  2. 如果身份验证失败(由于令牌过期)尝试使用本地存储的令牌获取新令牌 刷新令牌
  3. 备选方案:
    • 成功时:
      1. 将新获取的token保存在本地
      2. 尝试重新验证,如果失败,显示错误
    • 失败时(因为刷新令牌也已过期):显示登录对话框
    • 失败时(其他原因):显示错误

我已经实现了2个Observables,一个用于身份验证,一个用于刷新令牌。 return 2 种不同类型的结果。


我现在很难将这些链接到上述步骤中。 有没有人可以给我提示?

或者这更像是一个单独的 class 来处理这个过程而不是 RxJava 链(因为太复杂)?

我认为这可以使用错误处理运算符 onErrorResumeNext() 以更简单的方式完成,如果 Observable 遇到错误,它将控制传递给另一个 Observable 而不是调用 onError()

让我们假设您的 2 个可观察值是:

// Assuming authenticate returns an exception of typeA if it fails
Observable<A> authenticate;
// returns an exception of typeB if refresh fails
Observable<B> refresh;

现在让我们使用 concatMap 创建另一个可观察对象。

// Probably you want to emit token from refresh observable. If not,
// then I hope you will get the idea how it's done. 
Observable<Object> refreshThenAuthenticate = refresh.concatMap(new Func1<A, Observable<B>>() {
        @Override
        public Observable<A> call(B b) {
            // create an authentication observable using the token
            return createAuthenticateObservable(b.getToken());
        }
});
// Above can be written in much simpler form if you use Java 8 lambdas.


/* first authenticate will be executed, if it fails then control will
 * go to refreshThenAuthenticate.
 */
authenticate
.onErrorResumeNext(refreshThenAuthenticate)
.subscribe(new Observer<A>() {
            @Override
            public void onCompleted() {
               // login successful
            }

            @Override
            public void onError(Throwable e) {
                // if e of typeA show login dialog
                // else do something else
            }

            @Override
            public void onNext(A a) {

            }
        });