switchIfEmpty 总是被调用
Posted
技术标签:
【中文标题】switchIfEmpty 总是被调用【英文标题】:switchIfEmpty is always called 【发布时间】:2020-08-07 23:51:25 【问题描述】:我有这样的方法:
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 仍然被调用?
【问题讨论】:
【参考方案1】:问题是return
。无论findByType
是否发出值,都需要评估switchIfEmpty
的参数,这意味着需要评估defer
的参数,并且return
将在整个函数getActiveVersionWithCacheMiss
之外返回。
虽然我看不出这段代码是如何编译的; return persist(...)
没有 Mono.defer
可以使用的值。你真的有大括号,而不是括号
()
吗?
【讨论】:
当我在 persist() 之前删除返回时,它给了我以下错误:Error:(30, 30) Kotlin: Type inference failed: fun <T : Any!> defer(p0: Supplier<out Mono<out T!>!>): Mono<T!> cannot be applied to (Mono<ActiveVersion>)
关于第二部分,我没有明白你所说的 或 () 的意思
类似Mono.defer return persist(ActiveVersion(type,1))
。我猜你实际上需要Mono.defer persist(ActiveVersion(type,1))
或Mono.defer(Supplier<Mono<ActiveVersion>> persist(ActiveVersion(type,1)) )
。
正如你所说,用大括号替换括号解决了这个问题,谢谢。以上是关于switchIfEmpty 总是被调用的主要内容,如果未能解决你的问题,请参考以下文章
ReactJs/NextJs useEffect() 总是被调用两次
performSegue 并不总是转换,但 prepare(for:sender) 总是被调用
在 Objective-C 中,指定初始化程序总是被调用的规则并不总是被遵守?
heightForRowAtIndexPath 总是被调用两次