RxJava 的重试当意外地永远重试时



任何人都可以...

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

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

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)
  1. 您已将retryWhen应用于执行 if 语句的任一分支的结果。

  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()

请看一下相同的问题和答案

复制的答案:retryWhenObserver订阅时调用提供的函数,因此您有一个主序列,并带有一个发出主序列失败Throwable的序列。您应该将逻辑组合到您在此Function中获得的Observable上,以便在最后,一个Throwable将在另一端产生一个值。

我想你的期望是:
Observable
.just(Unit)
.flatMap {
if (Random.nextBoolean()) {
Observable.just(Unit)
} else {
Observable.error(Throwable())
}.retryWhen {
it.takeWhile {
Random.nextBoolean()
}
.doOnNext {
println("retryWhen")
}
}
}
.subscribe()

相关内容

  • 没有找到相关文章

最新更新