kotlin - 流程先等待,然后在后台处理其余的
问题描述
我有一些东西。而且我必须尽快编写返回第一项的函数,并且随后对该函数的所有调用都返回流的最新值。
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())
}
输出一开始应该是一个,并且在某些时候,总是两个。上面的代码总是返回,我不明白为什么。
解决方案
因为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())
}
推荐阅读
- ios - UIButton 导致无法识别的选择器发送到实例
- node.js - this.props.SignupUser 不是我的 SignupComponent 文件中的函数 有什么问题?
- php - 如何按数字之和对一串数字进行排序
- java - EXCEPTION_ACCESS_VIOLATION 导致 JVM 崩溃
- java - Java - 如何在排队其他人时一次发送一定数量的http请求
- go - 使用 csv 读取处理单值上下文中的多值
- unix - 使用 find 命令查找多个文件,但 unix 命令中的 perticular2 文件除外
- jquery-select2 - 更改侦听器上的 Wicket Select2
- c++ - C++:使用迭代器构造一个二维动态分配的数组
- azure-api-management - Azure api 管理 git 存储库媒体文件