2016-12-28 37 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

輝煌,這正是我想要的,謝謝。 –