首页 > 解决方案 > 流程先等待,然后在后台处理其余的

问题描述

我有一些东西。而且我必须尽快编写返回第一项的函数,并且随后对该函数的所有调用都返回流的最新值。

val f = flow {
    emit(1)
    delay(100)
    emit(2)
}

suspend fun getLatest() = f.conflate().first() // this should be fixed, something like latest()

suspend fun main() {
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
}

输出一开始应该是一个,并且在某些时候,总是两个。上面的代码总是返回,我不明白为什么。

标签: kotlinkotlin-coroutines

解决方案


因为Flow是寒流。每次你打电话first(),阻止

    emit(1)
    delay(100)
    emit(2)

将再次被调用。

将来,SharedFlow将被添加到库中,请参阅pull request,我们可以这样写:

val f = flow {
    emit(1)
    delay(100)
    emit(2)
}

val coroutineScope: CoroutineScope = ...
val shared = f.conflate().shareIn(
        coroutineScope,
        replay = 1,
        started = SharingStarted.WhileSubscribed()
)

suspend fun getLatest() = shared.first() // this should be fixed, something like latest()

suspend fun main() {
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
}

推荐阅读