【问题标题】:RxJava timeout without emiting error?RxJava 超时而不发出错误?
【发布时间】:2019-08-07 04:28:18
【问题描述】:

是否可以选择不发出 Throwabletimeout 变体?

我想发出 complete 事件。

【问题讨论】:

    标签: operators rx-java


    【解决方案1】:

    您不需要使用 onErrorResumeNext 映射错误。您可以使用以下方法提供一个可观察的备份:

    timeout(long,TimeUnit,Observable)

    应该是这样的:

        .timeout(500, TimeUnit.MILLISECONDS, Observable.empty())
    

    【讨论】:

    • 这应该是公认的答案,因为原始帖子要求提供此答案提供的“超时”的变体。
    【解决方案2】:

    您可以使用另一个Observable 从错误中恢复,例如:

     Observable<String> data = ...
     data.timeout(1, TimeUnit.SECONDS)
         .onErrorResumeNext(Observable.empty())
         .subscribe(...);
    

    【讨论】:

    • 这就是这段代码的作用。它将您的错误转换为立即完成的 Observable
    • 值得注意的是,如果有可能来自更上游的错误,则此解决方案不起作用,因为它也会捕获这些错误...
    • downvote - 这将导致所有其他有效错误返回空
    【解决方案3】:

    不使用Observable.timeout 的更简单的解决方案(因此它不会产生错误并有捕获不需要的异常的风险)可能是简单地采取直到计时器完成:

    Observable<String> data = ...
    data.takeUntil(Observable.timer(1, TimeUnit.SECOND))
        .subscribe(...);
    

    【讨论】:

    • 但是timer 不会在每次源Observable 发出一个项目时重新启动,与timeout 形成对比。
    【解决方案4】:

    您始终可以使用 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);
    }
    

    【讨论】:

    • 我想在onError之后完成流
    • 您将在 onErrorResumenNext 中发出您的 Observable ,它将完成管道。运行我写的测试,你就会明白。如果您想查看更多实际示例,请点击此处github.com/politrons/reactive
    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多