与使用 Kotlin 和 rx-java combineLatest 的表单验证混淆

Confusion with form validation using Kotlin and rx-java combineLatest

所以我想使用 rx-java2 进行表单验证。我正在使用科特林。我遇到了两个问题。 emailObservable 和 passwordObservable 都是 Disposable! 类型。我试图通过调用 val emailObservable: Observable<Boolean> 来指定类型,但 Android Studio 认为它是 Disposable!.

其次,当我想使用方法 combineLatest 时出现错误:可以使用提供的参数调用以下函数的 None。

emailObservable 和 passwordObservable 都可以正常工作。 我是 rx-java 的新手,我对这种类型的东西感到困惑。

val emailObservable = RxTextView.afterTextChangeEvents(textEmail)
                .observeOn(AndroidSchedulers.mainThread())
                .map { x -> textEmail.text.length > 3 }
                .subscribe { x -> foo(x) }

val passwordObservable =RxTextView.afterTextChangeEvents(textPassword)
                .observeOn(AndroidSchedulers.mainThread())
                .map { x -> textPassword.text.length > 5 }
                .subscribe { x -> foo(x) }


Observable.combineLatest(emailObservable,
passwordObservable,
BiFunction { x: Boolean, y:Boolean -> x && y })

关于 DisposableObservable 实际上 compiler/IDE 是正确的。 subscribe 方法在 Observable 和 returns 和 Disposable 上调用,也就是说,您可以使用它在 Observable 完成之前取消订阅(有点像"cancel").

然后 combineLatest 方法预计会用 2 Observable 调用,而您提供的是 2 Disposable。 要解决此问题,您不应直接在链中调用 subscribe,而应在 combineLatest.

的结果上调用

示例:

fun main(args: Array<String>) {
    val first = Observable.intervalRange(1, 10, 0, 2, TimeUnit.SECONDS)
    val second = Observable.intervalRange(10, 20, 0, 1, TimeUnit.SECONDS)

    Observable.combineLatest(arrayOf(first, second)) {
        "${it[0]} -> ${it[1]}"
    }.blockingSubscribe() {
        println(it)
    }
}

输出:

1 -> 10
1 -> 11
2 -> 11
2 -> 12
2 -> 13
...