RxJava (Android) - 错误的中间步骤,错误解决后重试
RxJava (Android) - Intermediate step on error, retry after error resolution
我目前正在尝试让自己进入 RxJava。
现在我有以下场景:
我必须对用户进行身份验证。
我需要为此执行的步骤如下:
- 尝试使用本地存储的令牌对用户进行身份验证
- 如果身份验证失败(由于令牌过期)尝试使用本地存储的令牌获取新令牌
刷新令牌
- 备选方案:
- 成功时:
- 将新获取的token保存在本地
- 尝试重新验证,如果失败,显示错误
- 失败时(因为刷新令牌也已过期):显示登录对话框
- 失败时(其他原因):显示错误
我已经实现了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) {
}
});
我目前正在尝试让自己进入 RxJava。
现在我有以下场景:
我必须对用户进行身份验证。
我需要为此执行的步骤如下:
- 尝试使用本地存储的令牌对用户进行身份验证
- 如果身份验证失败(由于令牌过期)尝试使用本地存储的令牌获取新令牌 刷新令牌
- 备选方案:
- 成功时:
- 将新获取的token保存在本地
- 尝试重新验证,如果失败,显示错误
- 失败时(因为刷新令牌也已过期):显示登录对话框
- 失败时(其他原因):显示错误
- 成功时:
我已经实现了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) {
}
});