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. Androidのlistviewadapterラジオボタンの最初の項目をチェックし、項目をクリックすると、最初の項目のチェックが外されます
- 4. CheckBoxesのAndroid ListViewは、項目がチェックされている場合、常に最初の項目をチェックします。
- 5. RxJavaチェーンの最後の項目のみ例外をスローする
- 6. リストビューは最初の項目のみを表示します
- 7. JQueryクリックハンドラは最初の項目にのみ作用します
- 8. 返信のみ最初の項目
- 9. スピナーは、最初の項目
- 10. 最初の応答と2回目の応答のジャージ時間の差
- 11. Android Spinner重複した項目は、最初に重複した項目の位置のみを返します。
- 12. will_paginate on arrayは最初の項目のページのみを表示します
- 13. jQuery Onclickフィルタのみ最初の項目のみの作業
- 14. dir-pagination-controlsは最初の10項目のみを表示します。 Angularjs
- 15. センター最初の項目(GridLayoutManager)
- 16. SectionedRecyclerViewオーバーライド最初の項目
- 17. Oracle CONNECT BY - 最初のレベルの項目のみを返す
- 18. 私のスクリプトは、最初の項目を返します
- 19. 配列内の最初の項目を確認し、最後の項目
- 20. 最初と最後の項目のListView
- 21. 最初のページの読み込み時にページのリスト/テーブルの最初の項目を押す方法は?
- 22. ショッピングカート - 数量カートの最初の項目のみを更新します。
- 23. JQueryはクラス内の最初の項目にアクセスします
- 24. Isotop垂直タブは読み込み時に最初の項目を表示する必要があります
- 25. 配列から最初の項目を削除する組み込み手段はありますか?
- 26. LinearLayoutは最初の項目を表示します
- 27. CSSドロップダウンメニューは最初の項目を別にします
- 28. 2行のペーパードロップダウンメニューから最初の項目のみを選択
- 29. listviewの最初の項目はフォーカスを取得しません
- 30. setResultsNameは最初のリスト項目