我有一个这样的方法:
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来为findByType返回一个简单的值。在调试期间,activeVersionRepository.findByType(type).block()
的计算结果是一个值,并且绝对不是空的。我想知道为什么尽管使用了defer,switchIfEmpty仍然被称为?
发布于 2020-04-24 16:04:12
问题出在return
上。无论findByType
是否发送值,都需要对switchIfEmpty
的参数求值,这意味着需要对defer
的参数求值,并且return
将从整个函数getActiveVersionWithCacheMiss
返回。
虽然我不知道这段代码是如何编译的,但return persist(...)
没有Mono.defer
可以使用的值。你真的有大括号{}
,而不是圆括号()
吗?
https://stackoverflow.com/questions/61407819
复制