如何为多个可观察对象设置超时时间

问题描述 投票:2回答:1

我有一个场景,我有两个可观察对象,每个都从API调用返回一个项目。

我想做的是:

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

我很赞赏如何实现这一目标的提示。

java android rx-java rx-android
1个回答
4
投票

假设两个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());

最后一步是合并来自可观测对象的发射,但是您希望最后发出任何超时错误,幸运的是,mergeDelayError操作符就是这样做的

Observable<T> mergedCalls = Observable.mergeDelayError(apiCall1WithTimeoutNewThread, apiCall2WithTimeoutNewThread);
© www.soinside.com 2019 - 2024. All rights reserved.