我有一个简单的网络轮询函数,具有可观察的间隔
private fun pollFromApi(): Observable<MyState> {
return Observable.interval(3L, TimeUnit.SECONDS, schedulerProvider.io())
.startWith(0L)
.flatMap {
api.getState().toObservable()
}
.map {
// map response to MyState
}
.onErrorReturn {
return@onErrorReturn MyState.Polling // if error occurred emit Polling State
}
.takeUntil {
// stop polling if certain State is reached
}
}
我遇到的问题是,如果在轮询的一个网络API调用失败,轮询停止。理想情况下,我想要的是不断重试,直到takeUntil
停止轮询,如果发生错误,只需忽略它,不向观察者发出任何东西。
我尝试添加onErrorReturn
,但这只是捕获错误并停止轮询。
您可以使用Observable#onErrorResumeNext
操作符链接到您的远程(可能失败)API调用,发出不满足您的#takeUntil
子句的项避免停止处理:
private fun pollFromApi(): Observable<MyState> {
return Observable.interval(3L, TimeUnit.SECONDS, schedulerProvider.io())
.startWith(0L)
.flatMap {
api.getState().toObservable().onErrorResumeNext(ignored -> null) // or some other SENTINEL value
}
.map {
// map response to MyState
}
.takeUntil {
// stop polling if certain State is reached
}
}
正如我在评论中提到的,您必须在flatMap
中对api调用本身进行映射和错误处理:
private fun pollFromApi(): Observable<MyState> {
return Observable.interval(3L, TimeUnit.SECONDS, schedulerProvider.io())
.startWith(0L)
.flatMap {
api.getState().toObservable()
.map {
// map response to MyState
}
.onErrorReturn {
return@onErrorReturn MyState.Polling // if error occurred emit Polling State
}
}
.takeUntil {
// stop polling if certain State is reached
}
}