如果发生错误,如何以可观察的间隔继续轮询



我有一个简单的网络轮询函数,具有可观察的间隔

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
}
}

相关内容

  • 没有找到相关文章

最新更新