RxJava超时没有发出错误?

时间:2016-07-04 08:20:23

标签: operators rx-java

是否有选项让timeout的变体不会发出Throwable

我希望complete事件发生。

4 个答案:

答案 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);
}