【问题标题】: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,使它们超时。
你可以使用amb 和Timer 函数来做到这一点。
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);