Kotlin:第一次发射时的 MutableSharedFlow BufferOverflow 行为
Kotlin: MutableSharedFlow BufferOverflow behaviour on first emissions
我有以下代码片段:
val flow = MutableSharedFlow<Int>()
launch {
repeat(10) {
delay(100)
println("emitting$it")
flow.emit(it)
}
}
launch {
flow.collect {
delay(1000)
println("a$it")
}
}
launch {
flow.collect {
println("b$it")
}
}
我希望输出如下:
发射0
b0
a0
发射1
b1
a1
...
因为 BufferOverflow.SUSPEND
导致发射器等待事件被消耗。
实际输出遵循此模式,但前两个元素除外,因此实际输出为:
emitting0 b0 emitting1 b1 a0(现在它开始遵循我预期的行为)emitting2 b2 a1 emitting3 b3 a2 ...
是什么导致了第二项排放?它不应该等待第一个项目被消耗吗?
它确实在等待。让您感到困惑的是打印 a#
之前的 delay(1000)
。当它打印 a#
时,已经过了 1 秒,因为它开始使用它。交换一下,你就会看清楚了。
flow.collect {
println("a$it")
delay(1000)
}
你也可以在一个项目被发射后打印一些其他的东西来让它更清楚:
repeat(10) {
delay(100)
println("emitting$it")
flow.emit(it)
println("emited$it")
}
这是它的输出:
emitting0
a0
b0
emited0
emitting1
b1
a1
emited1
emitting2
b2
a2
emited2
...
我有以下代码片段:
val flow = MutableSharedFlow<Int>()
launch {
repeat(10) {
delay(100)
println("emitting$it")
flow.emit(it)
}
}
launch {
flow.collect {
delay(1000)
println("a$it")
}
}
launch {
flow.collect {
println("b$it")
}
}
我希望输出如下:
发射0 b0 a0 发射1 b1 a1 ...
因为 BufferOverflow.SUSPEND
导致发射器等待事件被消耗。
实际输出遵循此模式,但前两个元素除外,因此实际输出为: emitting0 b0 emitting1 b1 a0(现在它开始遵循我预期的行为)emitting2 b2 a1 emitting3 b3 a2 ...
是什么导致了第二项排放?它不应该等待第一个项目被消耗吗?
它确实在等待。让您感到困惑的是打印 a#
之前的 delay(1000)
。当它打印 a#
时,已经过了 1 秒,因为它开始使用它。交换一下,你就会看清楚了。
flow.collect {
println("a$it")
delay(1000)
}
你也可以在一个项目被发射后打印一些其他的东西来让它更清楚:
repeat(10) {
delay(100)
println("emitting$it")
flow.emit(it)
println("emited$it")
}
这是它的输出:
emitting0
a0
b0
emited0
emitting1
b1
a1
emited1
emitting2
b2
a2
emited2
...