【问题标题】:How to avoid get(id) method invoked if verify() return Mono.error(TheException())如果verify()返回Mono.error(TheException()),如何避免调用get(id)方法
【发布时间】:2019-01-20 10:06:43
【问题描述】:

首先需要verify()的东西,如果一切正常则调用get(id)方法获取实体,否则不需要调用get(id)。方法verifyThenGet(id)代码怎么写?

fun verifyThenGet(id: Int) : Mono<MyEntity> {
    return verify().then(get(id)) // also invoke get(id) even verify failed
}

// return Mono.empty() if success to verify,
// otherwise return Mono.error(TheException())
fun verify() : Mono<Void>

// get the entiry
fun get(id: Int) : Mono<MyEntity>

【问题讨论】:

  • 为什么verify() 首先返回Mono&lt;Void&gt;?为什么是 Void(尤其是在 Kotlin 中)?
  • 因为如果验证成功,不需要返回任何东西,只需完成信号。
  • 如果编译失败,需要阅读编译器的错误信息,看不懂的贴出来。并发布实际代码。 int 在 Kotlin 中不存在。
  • @JBNizet 将 int 正确为 Int。对不起,我问错了,我再改一次。
  • get(id) 被调用是完全正常的。 get(id) 只是创建一个 Mono。它实际上并没有做任何事情。实际工作(即通过查询数据库获取实体)将在订阅者订阅 get(id) 返回的 Mono 时发生。但如果 verify() 返回错误 Mono,则不会发生这种情况。

标签: kotlin project-reactor


【解决方案1】:

鉴于您的代码中的 cmets,您的 verify 方法看起来应该具有以下签名:

fun verify(): Unit

在 Kotlin 中,通常你会抛出一个 Exception 而不是返回一个错误(也许你有自己的错误类型要返回?在这种情况下,如果你真的想要返回 MyError?)。

get 应该是这样的:

fun get(id: Int): MyEntity?

类型名末尾的?表示返回值是可选的,所以可能是null

verifyget 函数结合起来很简单:

fun verifyThenGet(id: Int): MyEntity? {
    verify()
    return get(id)
}

【讨论】:

  • 明确一点,我的问题代码是响应式程序代码,所有方法都需要响应式。所以返回值设计为 Mono。
  • 如果您忘记在问题中提及这一点,您希望我们如何知道?
猜你喜欢
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多