如何在RxJava Iterable Observable中重复一个,但继续其他

时间:2018-08-27 16:33:44

标签: rx-java rx-java2 reactivex

说我有一个从迭代器或数组创建的Observable。如果我将可观察值映射到返回某些内容的方法,那么如果我得到了一个我不喜欢的值,同时又继续处理我收到了我喜欢的值的iterable / array中的项,那么该如何重试该行为?

以下是伪代码来描述我在说什么:

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

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

2 个答案:

答案 0 :(得分:0)

在调用周围放置一个循环并返回所需的值:

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

答案 1 :(得分:0)

如果您不喜欢发射的值,则可以通过将其映射到错误,然后使用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()将在默认调度程序上尝试每个请求,从而导致许多并行请求。您可以添加参数来限制并行度。