当前位置: 首页 > 知识库问答 >
问题:

如何添加超时以检测可观察对象有一段时间没有发出

姜晨
2023-03-14

我的用例如下:

我创建了一个可观察的来访问远程服务器以获取一些数据。但是,由于服务器设计不完善,因此可能永远没有响应,也没有异常。为了解决这个问题,我希望有一些超时重试机制。

目前,我尝试启动一个计时器来停止请求,并在请求中抛出异常,然后重试,直到达到一定的尝试次数或实际超时。我试着使用mergeWith操作符将请求与可观察项合并。间隔映射为使用可观察值生成错误。error(),但是我无法在订阅服务器中捕获错误,它看起来像是可以观察到的。间隔永远不会结束。

对于RXJAVA中的任何操作员,我应该如何处理这种情况?

我当前的代码如下所示:

Observable.fromEmitter(fetchNetwork->...)
.mergeWith(Observable.interval(...)
           .flatmap(n->(observable.error)))
.retryWhen(error->(checkTimeExceed))
.subscribe(handleResult)

共有1个答案

澹台建华
2023-03-14

您可以将timeout()运算符与retryWhen()一起使用:

Observable.fromEmitter(fetchNetwork->...)
     .timeout(TIMEOUT_VALUE, TimeUnit.SECONDS)
     .retryWhen(observable -> observable.flatMap(error -> {
                if (error instanceof TimeoutException) {
                    return Observable.just(new Object());
                } else {
                    return Observable.error(error);
                }
            }))
     .subscribe(handleResult)

这将在超时值秒后使请求超时,并在请求超时时重试,其他错误将像往常一样传播到订阅服务器onError()

 类似资料:
  • 我试图检测一个可观察的(我的case按钮.rx.tap)是否在3秒钟内没有发出任何值。如果是,我想更新用户界面。以下是我迄今为止的尝试: 我的目标是在三秒钟内不点击按钮时使视图动画化。我已经尝试过扫描、不间断更改和防抖,但是我遇到的大多数组合运算符只有在项目被可观察的对象发出时才会发出项目。非常感谢任何帮助。

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 我在我的项目中使用了Spring Boot,Spring Data,JPA(Hibernate)和MySQL。这是我的存储库界面中的方法签名: 当我检查SQL日志时,我可以看到“for共享”子句被附加到选择语句中。 这是MySQL文档中关于共享锁的一段引文: 如果这些行中的任何一行被尚未提交的另一个事务更改,您的查询将等待该事务结束,然后使用最新值。 我实际上可以通过从另一个线程更新该书来触发阻塞

  • 问题:我有一个功能,用户可以输入一个查询字符串,我创建了两个可观察对象,一个用于查询本地DB,另一个用于从API获取结果。这两个操作必须并行运行。我需要尽快显示DB中的结果,当API结果返回时,我需要进行检查以删除本地结果中的重复项。 我的方法:CombineTest似乎是最接近我需要的东西。但问题是,只有当两个可见光都发出结果时,它才会发出。我想我要找的是CombineLatest和Concat

  • Observables 是多个值的惰性推送集合。它填补了下面表格中的空白: 单个值 多个值 拉取 Function Iterator 推送 Promise Observable 示例 - 当订阅下面代码中的 Observable 的时候会立即(同步地)推送值1、2、3,然后1秒后会推送值4,再然后是完成流: var observable = Rx.Observable.create(functio

  • 我对RxJava很陌生,每当我有一个情况,我需要从链上的一个可观察的返回数据传递到调用“订阅” - 我很难理解如何在没有任何补丁的情况下以“反应式”方式做到这一点...... 例如: 我想发出obs1和obs2,得到它们的结果,然后发出obs3然后obs4,然后以订阅结束链,同时可以访问obs1、obs2、obs3和obs4的结果。 调用的顺序很重要,我需要在执行obs3之前完成obs1和obs2