通过 Kotlin 中的另一个挂起函数发出流
Emit Flow via another suspend function in Kotlin
如何让下面的流量采集器接收到“hello”?收集器正在调用 myFunction1()
,后者又调用 myFunction2()
。两者都是挂起函数。
目前当我点击 运行 时没有任何反应并且没有收到任何流量。我在这里遗漏了什么吗?
CoroutineScope(IO).launch {
val flowCollector = repo.myFunction1()
.onEach { string ->
Log.d("flow received: ", string)
}
.launchIn(GlobalScope)
}
class Repo {
suspend fun myFunction1(): Flow<String> = flow {
/*some code*/
myFunction2()
}
suspend fun myFunction2(): Flow<String> = flow {
/*some code*/
emit("hello")
}
}
除非您有非常具体的原因,否则从您的存储库返回 Flow
的函数不应暂停(因为 flow{}
生成器不会暂停)。由于挂起操作正在收集(等待值从中出来)。
根据您提供的代码,您正在寻找 flatMapLatest
函数。 Docs here
class Repo {
fun function1() =
flow {
val value = doSomething()
emit(value)
}
.flatMapLatest { emittedValue -> function2() }
fun function2() = flow {...}
}
您可以尝试使用 emitAll
函数来处理您的情况:
fun myFunction1(): Flow<String> = flow {
/*some code*/
emitAll(myFunction2())
}
fun myFunction2(): Flow<String> = flow {
/*some code*/
emit("hello")
}
emitAll
函数从 Flow
中收集所有值,由 myFunction2()
函数创建并将它们发送到收集器。
并且没有理由在每个函数之前设置一个 suspend
修饰符,flow
生成器不是 suspend
。
如何让下面的流量采集器接收到“hello”?收集器正在调用 myFunction1()
,后者又调用 myFunction2()
。两者都是挂起函数。
目前当我点击 运行 时没有任何反应并且没有收到任何流量。我在这里遗漏了什么吗?
CoroutineScope(IO).launch {
val flowCollector = repo.myFunction1()
.onEach { string ->
Log.d("flow received: ", string)
}
.launchIn(GlobalScope)
}
class Repo {
suspend fun myFunction1(): Flow<String> = flow {
/*some code*/
myFunction2()
}
suspend fun myFunction2(): Flow<String> = flow {
/*some code*/
emit("hello")
}
}
除非您有非常具体的原因,否则从您的存储库返回 Flow
的函数不应暂停(因为 flow{}
生成器不会暂停)。由于挂起操作正在收集(等待值从中出来)。
根据您提供的代码,您正在寻找 flatMapLatest
函数。 Docs here
class Repo {
fun function1() =
flow {
val value = doSomething()
emit(value)
}
.flatMapLatest { emittedValue -> function2() }
fun function2() = flow {...}
}
您可以尝试使用 emitAll
函数来处理您的情况:
fun myFunction1(): Flow<String> = flow {
/*some code*/
emitAll(myFunction2())
}
fun myFunction2(): Flow<String> = flow {
/*some code*/
emit("hello")
}
emitAll
函数从 Flow
中收集所有值,由 myFunction2()
函数创建并将它们发送到收集器。
并且没有理由在每个函数之前设置一个 suspend
修饰符,flow
生成器不是 suspend
。