是否有选项让timeout
的变体不会发出Throwable
?
我希望complete
事件发生。
答案 0 :(得分:9)
您可以使用其他Observable
从错误中恢复,例如:
Observable<String> data = ...
data.timeout(1, TimeUnit.SECONDS)
.onErrorResumeNext(Observable.empty())
.subscribe(...);
答案 1 :(得分:4)
一个不使用Observable.timeout
的简单解决方案(因此它不会产生错误并且有捕获不需要的异常的风险)可能只需要一个计时器完成:
Observable<String> data = ...
data.takeUntil(Observable.timer(1, TimeUnit.SECOND))
.subscribe(...);
答案 2 :(得分:4)
您不需要使用onErrorResumeNext映射错误。您可以使用以下方法提供可观察到的备份:
timeout(long,TimeUnit,Observable)
那会是这样的:
.timeout(500, TimeUnit.MILLISECONDS, Observable.empty())
答案 3 :(得分:3)
你总是可以使用 onErrorResumeNext 来获取错误,你可以发出你想要的任何项目 -
/**
* Here we can see how onErrorResumeNext works and emit an item in case that an error occur in the pipeline and an exception is propagated
*/
@Test
public void observableOnErrorResumeNext() {
Subscription subscription = Observable.just(null)
.map(Object::toString)
.doOnError(failure -> System.out.println("Error:" + failure.getCause()))
.retryWhen(errors -> errors.doOnNext(o -> count++)
.flatMap(t -> count > 3 ? Observable.error(t) : Observable.just(null)),
Schedulers.newThread())
.onErrorResumeNext(t -> {
System.out.println("Error after all retries:" + t.getCause());
return Observable.just("I save the world for extinction!");
})
.subscribe(s -> System.out.println(s));
new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS);
}