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

How to set a timeout for multiple observables

我有一个场景,我有两个 observable,每个 returns 来自 API 调用的一个项目。

我想做的是:

我很感激关于如何实现这一点的任何提示。

假设您的 api return 一个 Observable 具有 T 类型的发射,第一步是修改这些 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);