我有一个RXJava链,可以抛出错误。 我希望链继续并忽略错误并达到订阅,仅针对某些特定错误。
例如在此代码中
authDataManager
.getUserAccessToken(username, password)
.subscribeOn(Schedulers.io())
.doOnNext({
authDataManager.saveUserAccessToken(it)
})
.flatMap {
appDataManager.getStations()
}
.doOnNext({
appDataManager.persistStations(it)
})
.flatMap {
appDataManager.getDriverInformation()
}
.doOnNext({
appDataManager.persistDriverInformation(it)
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
onLoginSuccess()
},
{
onLoginFailure(it)
}
)
如果appDataManager.getStations()
引发错误,我仍然希望继续使用onLoginSuccess()
方法。
但是,如果getUserAccessToken(username, password)
失败,则应调用onLoginFailure
。
我试图在平面图和内部添加onErrorResumeNext()和onExceptionResumeNext(),但是如果我这样做,链就会退出并且不会继续并到达订阅
答案 0 :(得分:1)
我认为您可以使用onErrorResumeNext
运算符。
authDataManager
.getUserAccessToken(username, password)
.subscribeOn(Schedulers.io())
.doOnNext({
authDataManager.saveUserAccessToken(it)
})
.flatMap {
appDataManager.getStations()
.onErrorResumeNext(Observable.empty())
}
.doOnNext({
appDataManager.persistStations(it)
})
.flatMap {
appDataManager.getDriverInformation()
}
.doOnNext({
appDataManager.persistDriverInformation(it)
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
onLoginSuccess()
},
{
onLoginFailure(it)
}
)
答案 1 :(得分:1)
我在Kotlin here (stackoverflow link)
中想出了这个可以使用映射,过滤,可选项和onErrorResumeNext
的组合来完成。我认为这与当前版本的RxJava一样优雅。
authDataManager
.getUserAccessToken(username, password)
.subscribeOn(Schedulers.io())
.doOnNext({
authDataManager.saveUserAccessToken(it)
})
.flatMap {
appDataManager.getStations()
.map(stations -> Single.just(Optional.of(stations))
.onErrorResumeNext(error -> Single.just(Optional.empty()))
}
.filter(optional -> optional.isPresent())
.map(stations -> optional.get())
.doOnNext({
appDataManager.persistStations(it)
})
.flatMap {
appDataManager.getDriverInformation()
}
.doOnNext({
appDataManager.persistDriverInformation(it)
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
onLoginSuccess()
},
{
onLoginFailure(it)
}
)
答案 2 :(得分:0)
站在@ savepopulation的答案的肩膀上,并使用观察,你有三个不同的观察链:
authDataManager
.getUserAccessToken(username, password)
.subscribeOn(Schedulers.io())
.doOnNext({
authDataManager.saveUserAccessToken(it)
})
.doOnNext(
appDataManager.getStations()
.onErrorResumeNext(Observable.empty())
.subscribe( appDataManager.persistStations(it) )
)
.doOnNext( appDataManager.getDriverInformation()
.subscribe( appDataManager.persistDriverInformation(it)
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
onLoginSuccess()
},
{
onLoginFailure(it)
}
)
主要观察链流向完成,而两个子链完全不参与日志;它们只是通过获取用户访问令牌来触发。
如果您需要这些子分支以异步方式运行到主链,则必须添加subscribeOn()
/ observeOn()
运算符。