Kotlin 协程:如何 flatMapConcat 3 流,如果其中一个尚未开始发射?

Posted

技术标签:

【中文标题】Kotlin 协程:如何 flatMapConcat 3 流,如果其中一个尚未开始发射?【英文标题】:Kotlin coroutines: How to flatMapConcat 3 flows, if one of them has not started emitting yet? 【发布时间】:2021-11-14 19:56:54 【问题描述】:

我有 3 个流程:

val flow1 = ... // emits values from the app start
val flow2 = ... // emits values from the app start
val flow3 = someBooleanFlow.flatMapLatest if(it) flowOf(42) else emptyFlow()  // emits when user registered

我需要:

val state = flow1.flatMapConcat value1 ->
        flow2.flatMapConcat value2 -> 
     flow3.flatMapConcat value3 -> when ...  // so value3 is not received if flow3 is empty, 
// but I need its default value here to perform "when" logics
       
    

问题是当一个流没有发出时,如何在 flatMapConcat 中取一个默认值? 该问题也适用于combine

【问题讨论】:

【参考方案1】:

您可以在Flow 上使用onStart 来发出初始值:

val flowWithInitialValue = sourceFlow.onStart  emit(initialValue) 

您也可以为此使用StateFlow,并在构建时提供您的初始值。

我猜flow3 代表登录用户的某种用户 ID。

在这种情况下,我不会使用emptyFlow() 来表示未记录的情况。您可能可以使用可为空的用户 ID 或密封类作为流的元素,因此您可以发出 nullUserLoginStatus.Anonymous 作为第一个默认值。

【讨论】:

谢谢!!! onStart 可以正常工作)

以上是关于Kotlin 协程:如何 flatMapConcat 3 流,如果其中一个尚未开始发射?的主要内容,如果未能解决你的问题,请参考以下文章

如何启动Kotlin协程

如何使用 kotlin 协程处理回调

如何限制 kotlin 协程的最大并发性

如何确保清除 ktor websocket 客户端创建的所有 Kotlin 协程?

Kotlin 协程 - 延迟,它是如何工作的?

如何使用 Kotlin 协程获取 API 错误正文