2016-12-28 2 views
1

私は2つのオブザーバブルを持ち、それぞれがAPI呼び出しからアイテムを返します。私が何をしたいかRxJava:複数のオブザーバのタイムアウトを設定しますか?

は次のとおりです。

  • は、同時に両方のAPI呼び出しを実行します。
  • 両方のメソッドを終了するためのタイムアウト値(500ミリ秒)を設定します。
  • 両方の結果がタイムアウト値(500ミリ秒)を下回った場合、両方の結果が受信されます。両方から結果を受信します。終了した場合は結果を受信し、エラー秒のヌル値。
  • タイムアウト内に両方が終了しなかった場合は、エラーが表示されます。

私はそれを達成するためのヒントを教えてください。

答えて

4

あなたの両方のAPIがタイプ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")))); 

第2のステップは、オブザーバブルをさらに変更して、別のスレッドで作業するようにすることです。これはsubscribeOnオペレータ

Observable<T> apiCall1WithTimeoutNewThread = apiCall1WithTimeout.subscribeOn(Schedulers.newThread()); 
Observable<T> apiCall2WithTimeoutNewThread = apiCall2WithTimeout.subscribeOn(Schedulers.newThread()); 

最後のステップは、あなたの観測からの排出量をマージすることですが、あなたはどのタイムアウトエラーが最後に放出することにしたい、幸運にもmergeDelayError オペレータはちょうどそのよう

Observable<T> mergedCalls = Observable.mergeDelayError(apiCall1WithTimeoutNewThread, apiCall2WithTimeoutNewThread); 
を行うを使用して行われます
+0

鮮やかな、まさに私が欲しかったことです、ありがとうございます。 –

関連する問題