【发布时间】:2020-11-15 13:13:37
【问题描述】:
请帮忙。我试图这样做:
2sec 2sec 2sec
------[A]------[B]------[C]------...----------------> InitailFlow
\ | |
\ drop drop
\
5sec \ 5sec 5sec
----------[1]---------[2]---------[3]-----|> AnotherFlow
result: [A1, A2, A3]
所以我有 InitailFlow,它会发出很短的时间(2 秒),然后转换为 AnotherFlow,它需要更长的时间才能完成(总共 15 秒)...我想删除由InitialFlow 而 AnotherFlow 尚未完成...
我试过了:
flow{
delay(2000)
emit("A")
delay(2000)
emit("B")
delay(2000)
emit("C")
}.buffer(0, BufferOverflow.DROP_LATEST)
.onEach {
println("Event for $it")
}
.flatMapConcat {
flow {
delay(5000)
emit("${it}1")
delay(5000)
emit("${it}2")
delay(5000)
emit("${it}3")
}
}
.onEach {
println(it)
}
.launchIn(scope)
但由于某种原因,结果如下:
Event for A
A1
A2
A3
Event for B
B1
B2
B3
即使我有一个.buffer(0, BufferOverflow.DROP_LATEST),它仍然会处理Event B。
为什么还要处理事件 B?
有没有办法做到这一点?我希望输出只有:
Event for A
A1
A2
A3
提前致谢。
【问题讨论】:
-
您使用的是哪个协程版本?我相信我使用的是最新的但我找不到
.buffer(0, BufferOverflow.DROP_LATEST)功能... -
@Deadbeef 1.4.0添加
-
我并没有真正得到您期望的输出。你能举一个你想要的输出的例子吗?
-
@Deadbeef 它的 1.4.0-M1
-
@marstran 当然!我添加了预期的输出......它也与我的问题中的“图表”相同。所以只是为了澄清一点......只要
flatMap中的其他流程不是' t 完成...必须删除所有其他传入事件..如果flatMap flow完成,它可以再次接受另一个事件...