我目前正试图让自己进入RxJava。
现在我有以下情况:
我必须验证用户身份。
我需要为此做的步骤如下:
我已经实现的是2个Observable,一个用于身份验证,一个用于刷新令牌。 那些返回2种不同类型的结果。
我现在很难将这些链接到上面提到的步骤中。 是否有人可以给我一个提示?
或者更像是一个单独的类来处理这个过程而不是RxJava链(因为太复杂了)?
答案 0 :(得分:2)
我认为这可以使用错误处理运算符onErrorResumeNext()
以更简单的方式完成,该运算符将控制传递给另一个Observable而不是调用onError()
,如果observable遇到错误。
让我们假设你的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创建另一个observable。
// 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) {
}
});