Rx java 如何在RxJava可观察对象中重复一个但继续其他

Rx java 如何在RxJava可观察对象中重复一个但继续其他,rx-java,rx-java2,reactivex,Rx Java,Rx Java2,Reactivex,假设我有一个从一个可数或数组中创建的可观察对象。如果我将该可观察值映射到一个返回某个值的方法,那么如果我得到了一个不喜欢的值,同时又继续处理iterable/数组中我收到了一个喜欢的值的项,我如何重试该行为 下面是seudo代码来描述我所说的内容: Observable .fromIteratable(values) .map(value -> getSomeDataFromAnAPI(value)) .retryIf(value -> value != somethin

假设我有一个从一个可数或数组中创建的可观察对象。如果我将该可观察值映射到一个返回某个值的方法,那么如果我得到了一个不喜欢的值,同时又继续处理iterable/数组中我收到了一个喜欢的值的项,我如何重试该行为

下面是seudo代码来描述我所说的内容:

Observable
  .fromIteratable(values)
  .map(value -> getSomeDataFromAnAPI(value))
  .retryIf(value -> value != somethingIWant)
  .delay(10, TimeUnit.SECONDS);

我正在寻找如何完成“重试”行为。

围绕调用进行循环,并返回所需的值:

Observable
.fromIteratable(values)
.map(value -> {
    while (true) {
        Data d = getSomeDataFromAnAPI(value));
        if (d == somethingIWant) {
            return d;
        }
    }
}
.delay(10, TimeUnit.SECONDS);

如果您不喜欢发出的值,可以通过将其映射到错误,然后使用
retryWhen()
操作符重试来拒绝它(强制!)

Observable
  .fromIterable( values )
  .flatMap( value -> getSomeDataFromAnAPI( value )
                       .doOnNext( value -> {
                          if ( value != somethingIWant ) {
                            throw new IllegalStateException("undesired");
                          }
                       })
                       .retryWhen( throwable -> throwable.delay( 10,  TimeUnit.SECONDS) );
这将重试返回错误值的项,直到返回正确值为止


请注意,
flatMap()
将在默认计划程序上尝试每个请求,从而导致大量并行请求。您可以添加一个参数来限制并行性。

取决于代码的功能。如果您有阻塞或长时间运行的代码,您需要一种停止代码的方法。