首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么retryWhen()不成立?

为什么retryWhen()不成立?
EN

Stack Overflow用户
提问于 2017-05-16 21:27:33
回答 2查看 142关注 0票数 0

假设我有以下代码:

代码语言:javascript
复制
Observable.error(new Throwable()).
    retryWhen(notificationHandler -> Observable.never()).
    subscribe(x -> {}, t -> log("error"), () -> log("completed"));

我期望,它将保持执行,因为retryWhen永远不会重新提交到或完成。

但当我运行它时,应用程序停止了,甚至没有指示错误或竞争。

为什么它永远不会存在?

附言:我有这样的想法,那就是执行中断,因为它都运行在单线程上。并尝试将retryWhen()处理程序移动到另一个线程:

代码语言:javascript
复制
Observable.error(new Throwable()).
        retryWhen(notificationHandler -> Observable.create(subscriber -> {
            log("never");
        }).observeOn(Schedulers.newThread())).
        subscribe(x -> {}, t -> log("err"), () -> log("completed"));

但它没有帮助--仍然打印“从不”并停止。

EN

回答 2

Stack Overflow用户

发布于 2017-05-16 22:14:26

请在以下链接中查看来自Dan的解释:http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/

上面确实写着

让我们先看看最后一部分。返回的可观察对象的发射决定是否发生重新订阅。如果它发出onCompleted或onError,那么它就不会重新订阅。但是如果它发出onNext,那么它就会发出(不管onNext中实际是什么)。

retryWhen订阅Observable.never(),而后者不提供任何值。因此,管道处于停滞状态,您的应用程序将无法继续运行。要么抛出e onError/ onComplete,要么只抛出一个值:

让我们来看看这个测试。它显示不会发出任何值,也不会重新订阅它。

代码语言:javascript
复制
@Test
void name2() throws Exception {
    boolean await = Observable.error(new Throwable())
            .doOnEach(objectNotification -> System.out.println("x"))
            .retryWhen(notificationHandler -> Observable.never())
            .map(o -> -42)
            .doOnNext(System.out::println)
            .test()
            .await(100, TimeUnit.MILLISECONDS);

    assertThat(await).isFalse();
}

我期望,它将保持执行,因为retryWhen永远不会重新订阅to或

。但当我运行它时,应用程序停止了,甚至没有指示错误或竞争。

应用程序没有指示任何东西,因为由于Observable.never(),订阅onComplete/ onError永远不会到达。

票数 0
EN

Stack Overflow用户

发布于 2017-05-16 22:33:15

首先,我认为你把Observable.neverObservable.empty搞混了。当您使用Observable.never时,它将不会重试这两个已完成的错误(错误已被notificationHandler消耗)。

其次,当你使用retryWhen时,你应该在给定的notificationHandler上订阅。或者在subscribe时立即重试(subscribe时调用参数Func1<> notificationHandler,返回Observable发出项时重试)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44002847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档