如何解决Kotlin:首次排放时的 MutableSharedFlow BufferOverflow 行为
我有以下代码片段:
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 0 0 发射1 b1 a1 ...
因为 BufferOverflow.SUSPEND
导致发射器等待事件被消耗。
实际输出遵循此模式,但前两个元素除外,因此实际输出为: 发射0 b0发射1 b1 a0(现在它开始遵循我预期的行为)发射2 b2 a1发射3 b3 a2 ...
是什么导致了第二项发射?难道不应该等待第一项被消耗掉吗?
解决方法
它确实等待。让您感到困惑的是打印 delay(1000)
之前的 a#
。到它打印 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
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。