我有flatMap
运行一系列HTTP调用来注册用户,检索他们的个人资料以及其他一些事情。我想通知onError
subscription
中flatMap
的特定错误消息,具体取决于flatMap
错误发生的哪个阶段。也许注册成功,但检索创建的配置文件不是。我怎样才能实现这一点,以便我的Observable
在发生错误时停止所有后续调用?
以下是我的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
}));
的一些伪代码:
{{1}}
答案 0 :(得分: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
}));
使用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);
}
}));