Flow 取消:38. 操作符中的取消检查

本篇解析 example-flow-38.kt。探讨 Flow 在性能优先下的取消行为。

1. 核心问题:性能优于检查

出于性能原因,大多数 Flow 操作符(如 asFlow, map, filter不会自行执行额外的取消检测。

代码解析

1
2
3
4
5
6
fun main() = runBlocking {
(1..5).asFlow().collect { value ->
if (value == 3) cancel() // 收集到 3 时请求取消
println(value)
}
}
  • 结果分析:在这个例子中,即使在 3 之后调用了 cancel(),4 和 5 依然会被打印出来。
  • 原因asFlow() 只是简单地循环发射值,并没有像 flow { ... } 那样在 emit 之前检查 ensureActive()

2. 开发者感悟

这是一个非常关键的细节。它提醒我们:当你使用便捷构建器(如 asFlow)处理一个密集的循环时,如果中途被取消了,流可能并不会立即停止,而是会“惯性”地跑完剩余任务。

,