我已经实现了反应式编程,并且我正在使用Springboot Framework,Rxjava2,反应式Spring数据框架。我有一个关于在记录不存在时将记录保存到mongodb中的方案。
但是当我被动地检查记录时,我发现发射器停止前进了。
下面是我的示例代码。我有4个数据,其中2个不在数据库中。我发现发射器仅处理数据库中存在的数据。
val movies = mutableListOf("Secret Mother (Mainland) - 秘密媽媽","Life For Life - 命情真","Before Dawn - 愛在暴風的日子","The Threat Of Love 2 - Loving ou 我愛你2")
Observable
.fromIterable(movies)
.flatMapMaybe {
videoInfoService
.findVideoByTitle(it)
.switchIfEmpty(Maybe.empty())
}
.subscribe(object: Observer<VideoInfo>{
override fun onComplete() {
println("on complete ")
}
override fun onSubscribe(d: Disposable) {
println("on subscribe ")
}
override fun onNext(t: VideoInfo) {
println("on next: ${t.title}")
}
override fun onError(e: Throwable) {
e.printStackTrace()
}
})
感谢您的指导。我知道Rxjava2不能从我今天早上写的其他文章中继续使用null值,我想应该是处理这种情况的某种方式。
谢谢
答案 0 :(得分:0)
假设您将记录保存在mongodb中的方法返回Completable:
fun store(movie: Movie): Completable
并且您的videoInfoService.findVideoByTitle
方法返回一个Movie
实例,您可以将代码更改为:
Observable
.fromIterable(movies)
.flatMapSingle { title ->
videoInfoService
.findVideoByTitle(title)
.switchIfEmpty {
Single.defer {
val movie = Movie(title)
store(movie)
.andThen(Single.just(movie))
}
}
}
答案 1 :(得分:0)
这是我想要的输出。
感谢@Gustavo提供了答案,我从@Gustavo的答案中得到了提示,希望能得出这个答案。
val movies = mutableListOf("Secret Mother (Mainland) - 秘密媽媽","Life For Life - 命情真","Before Dawn - 愛在暴風的日子","The Threat Of Love 2 - Loving ou 我愛你2")
Observable
.fromIterable(movies)
.flatMap {
videoInfoService
.findVideoByTitle(it)
.toObservable()
.switchIfEmpty{
// Save the video
save(it)
}
}
.subscribe(object: Observer<VideoInfo>{
override fun onComplete() {
println("on complete ")
}
override fun onSubscribe(d: Disposable) {
println("on subscribe ")
}
override fun onNext(t: VideoInfo) {
println("on next: ${t.title}")
}
override fun onError(e: Throwable) {
e.printStackTrace()
}
})