【问题标题】:Unique coroutine scope for each item collected in a flow流中收集的每个项目的唯一协程范围
【发布时间】:2020-10-05 16:15:31
【问题描述】:
是否可以为接收到的每个项目创建一个类似于 collect 的流操作符,并具有自己的协程范围?
假设我有一个更新的自行车列表,Flow<List<Bicycle>>。我可以为每辆自行车索取价格,不幸的是,这个 API 要求我一次索取一辆自行车的价格。这一切都很好,我可以使用几个异步构建器启动一些请求,到目前为止没有问题。请求价格的 API 有时可能很慢,可能比可用或使用的新自行车流更慢。这就产生了仍在工作或等待获取不再可用或不再使用的自行车的价格的问题。有没有办法为从我的Flow<List<Bicycle>> 收集的每个项目创建协程范围,然后在收集新项目时取消它,以便我当前的请求仅针对流程中最后一个发出的项目(或自行车)?如果由于流程的顺序性而我理解正确,那么在前一项完成/完成之前不会请求下一项?
【问题讨论】:
标签:
kotlin
kotlin-coroutines
【解决方案1】:
如果您只想请求最新收集的物品,则可以使用collectLatest 终端操作员。一旦它收集到一个新项目,当前的请求就会被取消。
collectLatest 官方文档指出:
终端流操作符,它使用提供的收集给定的流
行动。与 collect 的关键区别在于,当原始
flow 发出一个新值,之前值的动作块被取消。
这是官方文档中公开的示例:
flow {
emit(1)
delay(50)
emit(2)
}.collectLatest { value ->
println("Collecting $value")
delay(100) // Emulate work
println("$value collected")
}
然后打印出来:
Collecting 1
Collecting 2
2 collected
你可以找到collectLatest官方文档here。