【问题标题】:How to continue polling with observable interval if error occurs如果发生错误,如何以可观察的间隔继续轮询
【发布时间】:2022-07-01 13:51:22
【问题描述】:

我有一个具有可观察间隔的简单网络轮询功能

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 但这只是捕获错误并停止轮询。

【问题讨论】:

  • 请使用您使用的onErrorReturn 发布代码。
  • @akarnokd 已更新。基本上只是返回了轮询状态。正如我所说,它捕获错误但停止间隔轮询
  • 如果getState 失败,请将onErrorReturn 放在getState 上。
  • 在这种情况下,我想我需要返回一个更复杂的原始网络响应
  • 是否有任何功能可以以某种方式忽略错误?

标签: java android kotlin rx-java


【解决方案1】:

您可以使用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
        }
}

【讨论】:

    【解决方案2】:

    正如我在 cmets 中提到的,您必须在 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
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 2022-06-18
      相关资源
      最近更新 更多