我有以下RxJava2 Kotlin代码:
val tester = Completable.complete()
.andThen(SingleSource<Int> { Single.just(42) })
.test()
tester.assertComplete()
tester.assertValue(42)
这模拟具有Completable observable(想象一个对API的简单更新操作),然后是Single observable(在API上映像获取操作)。我希望以一种方式连接两个observable,当Completable完成时,Single运行,最后我在我的观察者(Int 42)上获得onSuccess事件。
然而,此测试代码无效。断言失败并出现以下错误:
java.lang.AssertionError: Not completed
(latch = 1, values = 0, errors = 0, completions = 0))
我无法理解我做错了什么,我希望Completable在订阅时发出onComplete,然后Single订阅,我的观察者(tester
)获得值为42的onSuccess事件,但似乎订阅仍然“暂停”而不会发出任何东西。
这个想法类似于这篇博客文章中的内容:https://android.jlelse.eu/making-your-rxjava-intentions-clearer-with-single-and-completable-f064d98d53a8
apiClient.updateMyData(myUpdatedData) // a Completable
.andThen(performOtherOperation()) // a Single<OtherResult>
.subscribe(otherResult -> {
// handle otherResult
}, throwable -> {
// handle error
});
答案 0 :(得分:13)
问题是Kotlin对花括号的模糊使用:
.andThen(SingleSource<Int> { Single.just(42) })
您创建的SingleSource
注明了SingleObserver
,但是被Kotlin语法隐藏了。你需要的是明确的用途:
.andThen(Single.just(42))
或延期使用
.andThen(Single.defer { Single.just(42) })