0

任何人都可以……</p>

  1. 解释为什么下面的代码会无限期地重试,一旦retryWhen被调用?
  2. Random.nextBoolean() 更正代码以在返回时停止重试true

我认为有 50% 的机会retryWhen因为Random.nextBoolean(). 但是,一旦调用它,它就会进入无限循环。

import io.reactivex.rxjava3.core.Observable
import kotlin.random.Random

fun main() {
    Observable
        .just(Unit)
        .flatMap {
            if (Random.nextBoolean()) {
                Observable.just(Unit)
            } else {
                Observable.error(Throwable())
            }.retryWhen {
                it.flatMap {
                    println("retryWhen")
                    Observable.just(Unit)
                }
            }
        }
        .subscribe()
}

输出:

retryWhen
retryWhen
retryWhen
⋮
(continued)
4

2 回答 2

2
  1. 您已将 应用于retryWhenif 语句的任一分支的执行结果。

  2. retryWhen运算符链接到由 生成的流flatMap

例如

Observable
  .just(Unit)
  .flatMap {
    if(Random.nextBoolean()) {
      Observable.just(Unit)
    } else {
      Observable.error(Throwable())
    }
  }
  .retryWhen {
      it.flatMap {
        println("retryWhen")
        Observable.just(Unit)
      }
  }
  .subscribe()
于 2021-03-26T05:48:10.683 回答
0

请看相同的问题和答案

复制答案:

retryWhen当订阅它时调用提供的函数Observer,因此您有一个主序列伴随着一个发出Throwable主序列失败的序列。Observable你应该在你得到的结果上编写一个逻辑,Function所以最后,一个Throwable会在另一端产生一个值。

我认为您的期望是:
Observable
            .just(Unit)
            .flatMap {
                if (Random.nextBoolean()) {
                    Observable.just(Unit)
                } else {
                    Observable.error(Throwable())
                }.retryWhen {
                    it.takeWhile {
                        Random.nextBoolean()
                    }
                        .doOnNext {
                            println("retryWhen")
                        }
                }
            }
            .subscribe()
于 2021-03-26T06:55:46.810 回答