kotlin - 当时无法订阅

标签 kotlin project-reactor

当我使用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))!

{ }替换( ),一切将恢复正常。

关于kotlin - 当时无法订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837156/

相关文章:

kotlin - 如何选择Kotlin派生类中要覆盖的Java重载?

java - intellij 不存在类型变量 R 的实例,因此 Flux<R> 符合 Publisher<?扩展 DataBuffer> 问题

project-reactor - 如何减缓排放形成 Flux.interval?

android - 在 kotlin 文件中找不到可绘制对象

gradle - 如何将依赖项添加到我的自定义 Gradle 插件?

android - 我应该为每个 recyclerview 创建适配器吗?

java - 将 List<Mono<String> 转换为 Flux<String>

java - 在 Project Reactor 中处理来自 Mono 的可选值

java - Reactivestreams Subscriber 不适用于 Spring Reactor Mono。为什么?

android - 当用户按下主页按钮时,不会调用 onSaveInstanceState()