Flow 的
onEach
文档说:
有没有办法做到同样的事情,但是返回一个在上游流的每个值向下游发出之前调用给定操作的流。
after上游流的每个值都被发送到下游?最好不使用 delay(long)
.
Flow
确实是一个非常简单的界面,因此我们可以轻松地自己创建这样的运算符。我们唯一需要做的就是收集上游流,对于每个项目,首先将其发送到下游流,然后调用提供的操作:
fun <T> Flow<T>.onEachAfter(action: suspend (T) -> Unit): Flow<T> = object : Flow<T> {
override suspend fun collect(collector: FlowCollector<T>) {
[email protected] {
collector.emit(it)
action(it)
}
}
}
我们可以通过使用方便的 transform 运算符作为我们的构建块来使其变得更简单:
fun <T> Flow<T>.onEachAfter(action: suspend (T) -> Unit): Flow<T> = transform {
emit(it)
action(it)
}
用途:
suspend fun main() {
flowOf(1, 2, 3)
.onEachAfter { println("On each after: $it") }
.collect { println("Collect: $it") }
}
----------------
Collect: 1
On each after: 1
Collect: 2
On each after: 2
Collect: 3
On each after: 3