2016-12-28 35 views
1

我有一个场景,我有两个observables,每个从API调用返回一个项目。RxJava:设置多个观察对象的超时时间?

我想要做的是:

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

我赞赏有关如何实现这一点的任何提示。

回答

4

假设你的api都返回一个Observable类型为T的发射,那么第一步就是修改这些可观测值,使它们超时。 您可以使用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); 
+0

辉煌,这正是我想要的,谢谢。 –