当我使用Mono.thenMany
时,磁通数据丢失了,为什么?
@Test
fun thenManyLostFluxDataTest() {
Mono.empty<Int>()
.thenMany<Int> { Flux.fromIterable(listOf(1, 2)) }
.subscribe { println(it) } // why not output item 1, 2
}
如果更改为使用
blockLast()
进行订阅,则测试方法将永远运行。太可怕了:@Test
fun thenManyRunForeverTest() {
Mono.empty<Int>()
.thenMany<Int> { Flux.fromIterable(listOf(1, 2)) }
.blockLast() // why run forever
}
现在,我使用另一种方法来执行
thenMany
方法应该执行的操作:// this method output item 1, 2
@Test
fun flatMapIterableTest() {
Mono.empty<Int>()
.then(Mono.just(listOf(1, 2)))
.flatMapIterable { it.asIterable() }
.subscribe { println(it) } // output item 1, 2 correctly
}ed
最佳答案
您正在使用Kotlin的“lambda作为最后一个参数”的短格式语法。问题是,如果您查看thenMany
方法签名,则它不接受Function
,但接受Publisher
。
那么为什么lambda被接受,它代表什么呢?
实际上,它似乎被解释为Publisher
(因为它只有1种方法subscribe(Subscriber)
)!
用{ }
替换( )
,一切将恢复正常。