【问题标题】:RxJava/RxKotlin: Wait for value to be fetched async and then provide to all subscribersRxJava/RxKotlin:等待异步获取值,然后提供给所有订阅者
【发布时间】:2020-08-22 11:51:29
【问题描述】:
我有一个场景,我必须异步获取一些字符串。我想创建一个方法,当成功获取此值然后将其提供给侦听器时,我可以在其中收听。
现在,这可以通过多种方式轻松完成,包括回调侦听器或 lambda。
但是我应该使用什么来使对该方法的所有后续调用也返回字符串 - 无需再次获取它,因为它已经被获取了一次。因此,侦听器仍处于附加状态但在可用时立即提供值的解决方案。
我知道如何通过老式的回调监听器来做到这一点,值被存储在其中,然后对于后续调用,它可以通过回调立即返回。
但是有没有更紧凑/更复杂的方法来做到这一点,比如说通过 Rx?
谢谢。
【问题讨论】:
标签:
kotlin
asynchronous
listener
rx-java2
rx-kotlin2
【解决方案1】:
我认为您可以使用cache() 运算符。它会是这样的:
val value: Single<String> by lazy {
// emulation of your callback
Single.create<String> { emitter ->
Thread.sleep(1000)
println("do some work")
emitter.onSuccess("test")
}.cache()
}
fun main() {
value.subscribe { str -> println(str) }
value.subscribe { str -> println(str) }
value.subscribe { str -> println(str) }
Thread.sleep(2000)
// output:
// do some work
// test
// test
// test
}