【问题标题】:How to repeat one but continue with the others in an RxJava Iterable Observable如何在 RxJava Iterable Observable 中重复一个但继续其他的
【发布时间】:2023-03-26 05:15:02
【问题描述】:

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

这里是用来描述我在说什么的伪代码:

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

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

【问题讨论】:

    标签: rx-java rx-java2 reactivex


    【解决方案1】:

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

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

    【讨论】:

    • 取决于你的代码做什么。如果你有阻塞或长时间运行的代码,你需要一种方法来停止你的代码。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多