为什么我的Kotlin Flow onCompletion从未运行过?

为什么我的Kotlin Flow onCompletion从未运行过?,kotlin,kotlin-coroutines,flow,Kotlin,Kotlin Coroutines,Flow,因此,我有一个流,需要它从缓存中发出一个值,但在最后,如果缓存中没有任何内容(或刷新它的值),它将发出一个API调用来提取值。我正在尝试这个 override val data: Flow<List<Data>> = dataDao.getAllCachedData() .onCompletion { coroutineScope { launch { requestAndCacheDataO

因此,我有一个流,需要它从缓存中发出一个值,但在最后,如果缓存中没有任何内容(或刷新它的值),它将发出一个API调用来提取值。我正在尝试这个

override val data: Flow<List<Data>> = dataDao.getAllCachedData()
    .onCompletion {
        coroutineScope {
            launch {
                requestAndCacheDataOrEmitError()
            }
        }
    }
    .map { entities ->
        entities
            .map { it.toData() }
            .filter { it !is Data.Unknown }
    }
    .filterNotNull()
    .catch { emitRepositoryError(it) }
override val data:Flow=dataDao.getAllCachedData()
.未完成{
共线镜{
发射{
requestAndCacheDataOrEmitError()
}
}
}
.map{实体->
实体
.map{it.toData()}
.filter{it!是数据。未知}
}
.filterNotNull()
.catch{emitRepositoryError(it)}
因此,我们的想法是发出缓存,然后进行API调用以获取新数据,而不管原始映射如何。但我不希望它阻塞。例如,如果我们使用这个流,我永远不希望调用函数被onCompletion阻塞


我认为问题在于,
onCompletion
从未运行过。我设置了一些断点/日志,它根本不会运行,即使在
coroutineScope

之外,DAO的流只有在取消收集它的coroutine时才会完成。你希望什么时候完成?就在流的第一个值之后?你只关心第一个值吗?我明白了,我不知道它只会在cancel上运行。我关心第一个值,但在某些情况下,缓存中还没有数据,因此我希望onCompletion中的函数运行,该函数将更新缓存,并且流将发出一个新值。它应该在onCompletion运行后再次发出。我基本上预计它会发射两次。一次从缓存中提取,第二次在onCompletion完成后更新数据。