结合 Flow 和非 Flow api 响应 Kotlin
Combine a Flow and a non Flow api response Kotlin
我目前有一段逻辑如下:
interface anotherRepository {
fun getThings(): Flow<List<String>>
}
interface repository {
suspend fun getSomeThings(): AsyncResult<SomeThings>
}
when (val result = repository.getSomeThings()) {
is AsyncResult.Success -> {
anotherRepository.getThings().collectLatest {
// update the state
}
else -> { }
}
}
我遇到的问题是,如果 repository.getSomeThings
之前已被多次触发,anotherRepository.getThings
将因 repository.getSomeThings
中所有预加载值的数量而被触发.我想知道使用这些存储库的正确方法是什么,一个是挂起功能,另一个是一起使用 Flow。 Rx 中 combineLatest{} 的等效行为。
谢谢。
有几种方法可以解决您的问题。一种方法就是打电话
repository.getSomeThings()
在 collectLatest
块中并缓存最后一个结果:
var lastResult: AsyncResult<SomeThings>? = null
anotherRepository.getThings().collectLatest {
if (lastResult == null) {
lastResult = repository.getSomeThings()
}
// use lastResult and List<String>
}
另一种方法是创建一个 Flow
,它将调用 repository.getSomeThings()
函数和 combine
两个流程:
combine(
anotherRepository.getThings(),
flow {emit(repository.getSomeThings())}
) { result1: List<String>, result2: AsyncResult<SomeThings> ->
...
}
我目前有一段逻辑如下:
interface anotherRepository {
fun getThings(): Flow<List<String>>
}
interface repository {
suspend fun getSomeThings(): AsyncResult<SomeThings>
}
when (val result = repository.getSomeThings()) {
is AsyncResult.Success -> {
anotherRepository.getThings().collectLatest {
// update the state
}
else -> { }
}
}
我遇到的问题是,如果 repository.getSomeThings
之前已被多次触发,anotherRepository.getThings
将因 repository.getSomeThings
中所有预加载值的数量而被触发.我想知道使用这些存储库的正确方法是什么,一个是挂起功能,另一个是一起使用 Flow。 Rx 中 combineLatest{} 的等效行为。
谢谢。
有几种方法可以解决您的问题。一种方法就是打电话
repository.getSomeThings()
在 collectLatest
块中并缓存最后一个结果:
var lastResult: AsyncResult<SomeThings>? = null
anotherRepository.getThings().collectLatest {
if (lastResult == null) {
lastResult = repository.getSomeThings()
}
// use lastResult and List<String>
}
另一种方法是创建一个 Flow
,它将调用 repository.getSomeThings()
函数和 combine
两个流程:
combine(
anotherRepository.getThings(),
flow {emit(repository.getSomeThings())}
) { result1: List<String>, result2: AsyncResult<SomeThings> ->
...
}