RxJava 的 retryWhen unexpectedly keeps retrying forever
RxJava's retryWhen unexpectedly keeps retrying forever
任何人都可以……
- 请解释为什么以下代码会在调用
retryWhen
后无限期地重试?
- 更正代码以在
Random.nextBoolean()
时停止重试
returnstrue
?
我认为 retryWhen
有 50% 的几率因为 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)
您已将 retryWhen
应用于 if 语句任一分支的执行结果。
将 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()
请看同款
复制的答案:
retryWhen
在 Observer
订阅它时调用提供的函数,因此您有一个主序列伴随着一个发出 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()
任何人都可以……
- 请解释为什么以下代码会在调用
retryWhen
后无限期地重试? - 更正代码以在
Random.nextBoolean()
时停止重试 returnstrue
?
我认为 retryWhen
有 50% 的几率因为 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)
您已将
retryWhen
应用于 if 语句任一分支的执行结果。将
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()
请看同款
retryWhen
在 Observer
订阅它时调用提供的函数,因此您有一个主序列伴随着一个发出 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()