【问题标题】:How to set a timeout for multiple observables如何为多个可观察对象设置超时
【发布时间】:2016-12-28 15:20:58
【问题描述】:

我有一个场景,我有两个 observable,每个都从 API 调用返回一个项目。

我想做的是:

  • 同时执行两个 api 调用。
  • 为这两种方法设置一个超时值(500 毫秒)以完成。
  • 在完成后从两者接收结果,如果两者都花费的时间小于超时值(500 毫秒),我将从两者接收结果,如果一个只完成,那么我想接收其结果并接收错误或第二个的 null 值。
  • 如果两者都没有在超时时间内完成,我想收到一个错误。

我很欣赏有关如何实现这一目标的任何提示。

【问题讨论】:

    标签: java android rx-java rx-android


    【解决方案1】:

    假设你的 api 返回一个具有 T 类型发射的 Observable,第一步是修改这些 observable,使它们超时。 你可以使用ambTimer 函数来做到这一点。

    Observable<T> apiCall1WithTimeout = Observable.amb(apiCall1(), 
                                                       Observable.Timer(500, TimeUnit.MILLISECONDS)
                                                                 .flatmap(l -> Observable.error(new Exception("Api1 timed out")));
    Observable<T> apiCall2WithTimeout = Observable.amb(apiCall2(), 
                                                       Observable.Timer(500, TimeUnit.MILLISECONDS)
                                                                 .flatmap(l -> Observable.error(new Exception("Api2 timed out"))));
    

    第二步是进一步修改您的可观察对象,以便它们在不同的线程上工作。这是使用subscribeOn 运算符完成的

    Observable<T> apiCall1WithTimeoutNewThread = apiCall1WithTimeout.subscribeOn(Schedulers.newThread());
    Observable<T> apiCall2WithTimeoutNewThread = apiCall2WithTimeout.subscribeOn(Schedulers.newThread());
    

    最后一步是合并来自你的 observables 的发射,但你希望最后发射任何超时错误,幸运的是 mergeDelayError 操作员就是这样做的

    Observable<T> mergedCalls = Observable.mergeDelayError(apiCall1WithTimeoutNewThread, apiCall2WithTimeoutNewThread);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2020-09-14
      • 1970-01-01
      相关资源
      最近更新 更多