【发布时间】:2020-07-28 07:44:22
【问题描述】:
我有一个将数据作为流返回的 API:
suspend fun loadData(...): Flow<List<Items>>
suspend fun loadDetails(...): Flow<ItemDetails>
当我获取数据时,我需要加载一些项目的详细信息并将结果转换为实时数据:
job = SupervisorJob()
val context = CoroutineScope(job + Dispatchers.Main.immediate).coroutineContext
liveData(context = context) {
emitSource(
api.loadData(...)
.flatMapConcat { items ->
items.forEach { item ->
if (item is Details){
api.loadDetails(item).flatMapConcat{ details ->
item.details = details
}
}
}
flow {
emit(items)
}
}
)
这里emit(items) 在loadDetails 完成之前调用的问题,所以item.details = details 更新调用。
如何等待forEach更新所有项目?
【问题讨论】:
-
是
loadDetails实际上返回一个值流还是基本上只是一个封装在流中的挂起函数? -
@AdrianK 返回一个流,数据来自 ConflatedBroadcastChannel。事实上,我需要等待 ConflatedBroadcastChannel 返回“成功”数据状态(并忽略“加载”状态)
-
创建了只返回“成功”数据的包装流。并试图调用 .collect()。还是不行:(
标签: kotlin kotlin-coroutines kotlin-flow