ReactiveX(RxJava)には演算子timeout
があり、サブスクリプションストリームのすべての項目に適用されます。しかし、私は最初の応答をタイムアウトでチェックするだけで、次の応答のタイムアウトは気にしません。 RxJavaの演算子でこの要件をエレガントに実装するにはどうすればよいですか?次のようにそれを行うにはRxJavaはタイムアウトのある最初の応答項目のみをチェックします
6
A
答えて
2
一つの方法は次のとおりです。
Observable<Response> respStream = respStream();
ConnectableObservable<Response> sharedRespStream = respStream.publish();
Observable<String> first = sharedRespStream.first().timeout(2, TimeUnit.SECONDS);
Observable<String> rest = sharedRespStream.skip(1);
Observable<String> result = first.mergeWith(rest);
sharedRespStream.connect();
result.subscribe(response -> handleResponse(response), error -> handleError(error));
コード自己説明です:シェア応答は、重複した要求を避ける放出される最初の項目にタイムアウトを適用し、最初の1以下の項目でそれをマージします。
3
これはもっと機能的な方法です。これはScalaでありますが、Javaに転写する必要があります。
val myTimeout : Observable[Nothing] = Observable timer (10 seconds) flatMap (_ => Observable error new TimeoutException("I timed out!"))
myStream amb myTimeout
amb
オペレータが最初に発し、観察の値を返します。
0
ベストのオプションは、すべてのアイテムにタイムアウトが発生し、サブスクリプションにも1つ(興味のあるもの)であるtimeout overloadを使用することです。私が説明しよう
observable.timeout(() -> Observable.empty()
.delay(10, TimeUnit.SECONDS), o -> Observable.never())
、最初func0は、サブスクライブ上で実行されます、そしてあなたが望む時間だけ遅延(完全放射する)、空に観察を放出します。 アイテムが到着する前に時間が過ぎれば、あなたが望むようにタイムアウトになります。 2番目のパラメータはfunc1が
別のオプションは、ルチアーノの提案、次の あるので、私達はちょうど決して通過しないために(完全にないか、何かを)あなたは何の使用を持っていない項目、間のタイムアウトを決定します、あなたはこのようにそれを行うことができます。
public static class TimeoutFirst<T> implements Transformer<T,T> {
private final long timeout;
private final TimeUnit unit;
private TimeoutFirst(long timeout, TimeUnit unit) {
this.timeout = timeout;
this.unit = unit;
}
@Override
public Observable<T> call(Observable<T> observable) {
return Observable.amb(observable,
Observable.timer(timeout, unit).flatMap(aLong -> Observable.error(new TimeoutException("Timeout after " + timeout + " " + unit.name()))));
}
}
public static <T> Transformer<T, T> timeoutFirst(long timeout, TimeUnit seconds) {
return new TimeoutFirst<>(timeout, seconds);
}
これはambを使用したかなりすっきりしたソリューションです。
関連する問題
- 1. 列は最初の項目のみをチェックします。アクセスデータベース
- 2. RxJava、存在する場合は最初の項目を取得
- 3. CheckBoxesのAndroid ListViewは、項目がチェックされている場合、常に最初の項目をチェックします。
- 4. リストビューは最初の項目のみを表示します
- 5. 返信のみ最初の項目
- 6. スピナーは、最初の項目
- 7. Android Spinner重複した項目は、最初に重複した項目の位置のみを返します。
- 8. jQuery Onclickフィルタのみ最初の項目のみの作業
- 9. dir-pagination-controlsは最初の10項目のみを表示します。 Angularjs
- 10. SectionedRecyclerViewオーバーライド最初の項目
- 11. Oracle CONNECT BY - 最初のレベルの項目のみを返す
- 12. 最初と最後の項目のListView
- 13. 最初のページの読み込み時にページのリスト/テーブルの最初の項目を押す方法は?
- 14. JQueryはクラス内の最初の項目にアクセスします
- 15. RxJavaのonBackpressureDrop()は項目を削除しますか?
- 16. listviewの最初の項目はフォーカスを取得しません
- 17. 最初の応答者としてNSSearchField
- 18. setResultsNameは最初のリスト項目
- 19. Smack4.1.7応答タイムアウト内に応答がありません
- 20. php DomDocument、最初の項目のみが必要です
- 21. Drupalの6:親メニュー項目のリダイレクト最初のサブメニュー項目
- 22. 角度グリッター項目の中に応答性のあるSvgを作成する
- 23. 数字のアルファベット順の最初の項目を探します。
- 24. リンクハッシュマップの最初の項目を取得
- 25. ObservableCollectionの最初の項目をスキップ
- 26. ドロップダウンリストの最初の項目を選択
- 27. recyclerviewのチェック項目と未チェック項目のセクションを追加する方法は?
- 28. 最初の項目の幅に応じて余白を左に設定する
- 29. 最初の項目を除くすべての項目に対してjquery removeClass?
- 30. ボタンonclickは最初の追加チェックボックスのみをチェックします