【发布时间】:2019-08-07 04:28:18
【问题描述】:
是否可以选择不发出 Throwable 的 timeout 变体?
我想发出 complete 事件。
【问题讨论】:
是否可以选择不发出 Throwable 的 timeout 变体?
我想发出 complete 事件。
【问题讨论】:
您不需要使用 onErrorResumeNext 映射错误。您可以使用以下方法提供一个可观察的备份:
timeout(long,TimeUnit,Observable)
应该是这样的:
.timeout(500, TimeUnit.MILLISECONDS, Observable.empty())
【讨论】:
您可以使用另一个Observable 从错误中恢复,例如:
Observable<String> data = ...
data.timeout(1, TimeUnit.SECONDS)
.onErrorResumeNext(Observable.empty())
.subscribe(...);
【讨论】:
不使用Observable.timeout 的更简单的解决方案(因此它不会产生错误并有捕获不需要的异常的风险)可能是简单地采取直到计时器完成:
Observable<String> data = ...
data.takeUntil(Observable.timer(1, TimeUnit.SECOND))
.subscribe(...);
【讨论】:
timer 不会在每次源Observable 发出一个项目时重新启动,与timeout 形成对比。
您始终可以使用 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);
}
【讨论】: