RxJava Completable和Then测试

11

我有以下的 RxJava2 Kotlin 代码:

val tester = Completable.complete()
            .andThen(SingleSource<Int> { Single.just(42) })
            .test()        
tester.assertComplete()
tester.assertValue(42)

这里模拟了一个Completable observable(想象一下对API的简单更新操作)和一个Single observable(想象一下对API的获取操作)。我想以某种方式连接这两个可观察对象,使得当Completable完成后,Single运行,最终我能在我的观察者上获得onSuccess事件(Int 42)。

然而,这个测试代码没有起作用。断言失败,出现以下错误:

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
    });
1个回答

20

问题在于 Kotlin 的花括号使用含义不明确:

.andThen(SingleSource<Int> { Single.just(42) })

您创建了一个 SingleSource,但它对其 SingleObserver 没有任何作用,但这被 Kotlin 语法隐藏了。您需要的是简单的使用:

您创建一个对其 SingleObserver 没有任何作用的 SingleSource,但由于 Kotlin 语法的缘故,这一点被隐藏了。您需要的是简单地使用:

.andThen(Single.just(42))

或者推迟使用

.andThen(Single.defer { Single.just(42) })

1
感谢akarnokd,由于最初我正在执行.andThen { Single.just(42) },但它无法编译,因此我将其添加到了代码中。 - Miguel Beltran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接