本篇解析 example-flow-19.kt。学习一种处理消费慢的进阶手段。
1. 核心操作符:collectLatest
collectLatest 与 conflate 类似,都关注“最新值”。但它们的处理逻辑不同:
- conflate:如果收集器忙,就丢弃发射出的中间值。
- collectLatest:当新值发射时,如果收集器正在处理旧值,它会立即取消旧值的处理代码块,并开始处理新值。
2. 代码解析
1 | simple() |
- 100ms:发射 1,开始处理 1。
- 200ms:发射 2。此时 1 仅处理了 100ms,立即被取消,开始处理 2。
- 300ms:发射 3。此时 2 仅处理了 100ms,立即被取消,开始处理 3。
- 600ms:3 终于处理完了(300ms),打印 “Done 3”。
- 结果:只看到 1, 2, 3 的 “Collecting” 日志,但只有 3 打印了 “Done”。
3. 开发者感悟
collectLatest 非常适合处理诸如“搜索框自动补全”的场景。当用户输入下一个字母时,上一个字母对应的搜索请求已经没意义了,直接取消掉,只处理最后一次输入的请求。这能极大节省网络和计算资源。