Kotlin:MutableSharedFlow Buffer首次发射时的溢出行为



我有以下代码片段:

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 答0 发射1 B1 答1 ...

由于BufferOverflow.SUSPEND导致发射器等到事件被消耗。

实际输出遵循此模式,但前两个元素除外,因此实际输出为: 发出0 b0 发出1 b1 a0(现在它开始遵循我预期的行为)发出2 b2 a1 发出3 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
...

最新更新