【问题标题】:Return Mono.empty() from mono{} coroutine scope从 mono{} 协程范围返回 Mono.empty()
【发布时间】:2023-01-27 18:57:35
【问题描述】:
mono {
  val abc: Int? = getSomeValue().awaitSingleOrNull

  abc
}

如果 abc 为 null ,上面的块将返回什么?如果 abc 为 null ,如何返回 Mono.empty() ?

【问题讨论】:

    标签: spring kotlin spring-webflux project-reactor


    【解决方案1】:

    如果您仔细查看 mono 函数签名,您会发现:

    • 它允许 lambda/闭包返回空值:block: suspend CoroutineScope.() -> T?
    • 它返回一个不可为空的 Mono :Mono<T>(这是预期的,因为 Mono 不支持空值)

    文件指出:

    如果块的结果为空,则调用 MonoSink.success 时没有值。

    这作为解释可能不是很清楚,但这意味着在空值的情况下,将返回一个只发送完成信号的 Mono。这是空 Mono 的定义。

    我们可以用简单的程序来测试它:

    import kotlinx.coroutines.reactor.mono
    import reactor.core.publisher.Mono
    
    fun main() {
    
        var empty : Mono<String> = mono { null }
    
        empty.defaultIfEmpty("EMPTY !")
             .block()
            ?.let(::println)
    }
    

    它打印EMPTY !,这很好地表明 null 值已被视为“无值”,并产生了一个空的 Mono。

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 1970-01-01
      • 2021-08-17
      • 2022-07-05
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      相关资源
      最近更新 更多