switchIfEmpty 总是被调用
switchIfEmpty is always called
我有这样的方法:
fun getActiveVersionWithCacheMiss(type: String): Mono<ActiveVersion> {
return activeVersionRepository.findByType(type)
.switchIfEmpty(
Mono.defer(return persist(ActiveVersion(type,1)))
)
}
persist 方法是一种保存活动版本的简单方法:
fun persist(activeVersion: ActiveVersion): Mono<ActiveVersion>{...}
在我的测试中,我将 activeVersionRepository 模拟为 return findByType 的一个简单值。在调试期间 activeVersionRepository.findByType(type).block()
求值为一个值并且绝对不为空。
我想知道为什么尽管使用了 defer switchIfEmpty 仍然被调用?
问题是return
。无论findByType
是否发出值,switchIfEmpty
的参数都需要求值,这意味着defer
的参数需要求值,而return
将return 出整个函数 getActiveVersionWithCacheMiss
。
虽然我看不出这段代码如何编译; return persist(...)
没有 Mono.defer
可以使用的值。你真的有大括号 {}
,而不是圆括号 ()
吗?
我有这样的方法:
fun getActiveVersionWithCacheMiss(type: String): Mono<ActiveVersion> {
return activeVersionRepository.findByType(type)
.switchIfEmpty(
Mono.defer(return persist(ActiveVersion(type,1)))
)
}
persist 方法是一种保存活动版本的简单方法:
fun persist(activeVersion: ActiveVersion): Mono<ActiveVersion>{...}
在我的测试中,我将 activeVersionRepository 模拟为 return findByType 的一个简单值。在调试期间 activeVersionRepository.findByType(type).block()
求值为一个值并且绝对不为空。
我想知道为什么尽管使用了 defer switchIfEmpty 仍然被调用?
问题是return
。无论findByType
是否发出值,switchIfEmpty
的参数都需要求值,这意味着defer
的参数需要求值,而return
将return 出整个函数 getActiveVersionWithCacheMiss
。
虽然我看不出这段代码如何编译; return persist(...)
没有 Mono.defer
可以使用的值。你真的有大括号 {}
,而不是圆括号 ()
吗?