本篇解析 example-flow-38.kt。探讨 Flow 在性能优先下的取消行为。
1. 核心问题:性能优于检查
出于性能原因,大多数 Flow 操作符(如 asFlow, map, filter)不会自行执行额外的取消检测。
代码解析
1 | fun main() = runBlocking { |
- 结果分析:在这个例子中,即使在 3 之后调用了
cancel(),4 和 5 依然会被打印出来。 - 原因:
asFlow()只是简单地循环发射值,并没有像flow { ... }那样在emit之前检查ensureActive()。
2. 开发者感悟
这是一个非常关键的细节。它提醒我们:当你使用便捷构建器(如 asFlow)处理一个密集的循环时,如果中途被取消了,流可能并不会立即停止,而是会“惯性”地跑完剩余任务。