簡體   English   中英

從 mono{} 協程 scope 返回 Mono.empty()

[英]Return Mono.empty() from mono{} coroutine scope

mono {
  val abc: Int? = getSomeValue().awaitSingleOrNull

  abc
}

如果 abc 是 null,上面的塊會返回什么?如果 abc 是 null,如何返回 Mono.empty()?

如果您仔細查看mono function 簽名,您會看到:

  • 它允許 lambda/閉包返回 null 值: block: suspend CoroutineScope.() -> T?
  • 它返回一個不可為 null 的 Mono: Mono<T> (這是預期的,因為 Mono 不支持 null 值)

文件指出:

如果塊的結果是 null,則調用 MonoSink.success 時沒有值。

這作為解釋可能不是很清楚,但這意味着在 null 值的情況下,將返回僅發送完成信號的 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。

Mono.empty()等於

mono {
    // .. codes
    
    null // return
}

如果mono { null }flux { null }將是空事件。 如果您在null之前使用代碼,它們將運行,只是不發出任何內容。

val x: Mono<Void> = mono {
    // your code will be executed
    null
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM