我看到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));
的代碼是自我解釋:份額應避免重複請求,申請超時發出的第一個項目,並與項目下列第一個合併。
3
這是一個更實用的方法。這是Scala中,但應該被轉錄到Java:
val myTimeout : Observable[Nothing] = Observable timer (10 seconds) flatMap (_ => Observable error new TimeoutException("I timed out!"))
myStream amb myTimeout
的amb
操作符返回發出第一可觀察的價值。
0
最好的選擇是使用一個timeout overload,它返回每個項目的超時觀察值,並且還有一個用於訂閱(這是你感興趣的)。
observable.timeout(() -> Observable.empty()
.delay(10, TimeUnit.SECONDS), o -> Observable.never())
我會解釋,第一func0將在訂閱運行,並會發出空觀察到的(發射完成)由您希望的時間延遲。 如果在任何物品到達之前的時間過去了,就會出現你想要的超時時間。 第二個參數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. 在RxJava中超時
- 2. RxJava超時沒有退訂源
- 3. RxJava - 只需VS從
- 4. UpdatePanel的動畫只有超時
- 5. 超時已過期。只有在ASP.NET
- 6. JavaScript中只能有一個超時嗎?
- 7. 使用RxJava定時器和超時嵌套訂閱
- 8. RxJava:設置多個觀察對象的超時時間?
- 9. 讀取大數據塊時超時(但不是超時),但只有外部VS2010
- 10. 調用(超載)RxJava從斯卡拉
- 11. 鎖超時超時只發生在一小時內的錯誤
- 12. Fire RxJava事件只有在ViewPager中可見片段時纔會更改
- 13. RxJava:只有在特定時間段內的第一個項目發出
- 14. 有時只從一個SP獲取請求超時?
- 15. WCF服務調用 - 超時時只有部分參數?
- 16. spring-boot jar:只有在運行cron程序時連接超時
- 17. RxJava一次只能執行一個Observable
- 18. Promise.some()有超時?
- 19. 當Android設備被鎖定時,RxJava間隔和超時會偶爾停止
- 20. 彈簧@Transactional超時沒有超時
- 21. Rxjava -
- 22. NetworkOnMainThreadException時可觀察subscrible rxjava
- 23. Rxjava最短時間執行?
- 24. Android中的RxJava沒有Observable.create?
- 25. 只有pushViewController有時
- 26. 有超時的JavaScript
- 27. GetRequestStream()返回引發WebException超時......但只有在某些機器
- 28. 執行SetTimeout或$超時只有在某些動作
- 29. MongoDB的連接超時的問題只有3個用戶
- 30. 的TransactionScope超時最多隻有10分鐘