RxJava2 Flowable.combineLatest 行为如果所有的 Flowables 不发出

RxJava2 Flowable.combineLatest behavior if all Flowables don't emit

我正在关注 this code 以进行一些错误验证。这是 combineLatest 实现,它接受来自 3 个字段的输入并对每个字段进行错误验证。

Flowable.combineLatest(
            _emailChangeObservable,
            _passwordChangeObservable,
            _numberChangeObservable,
            (newEmail, newPassword, newNumber) -> {
              boolean emailValid = !isEmpty(newEmail) && EMAIL_ADDRESS.matcher(newEmail).matches();
              if (!emailValid) {
                _email.setError("Invalid Email!");
              }

              boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8;
              if (!passValid) {
                _password.setError("Invalid Password!");
              }

              boolean numValid = !isEmpty(newNumber);
              if (numValid) {
                int num = Integer.parseInt(newNumber.toString());
                numValid = num > 0 && num <= 100;
              }
              if (!numValid) {
                _number.setError("Invalid Number!");
              }

              return emailValid && passValid && numValid;
            })
        .subscribe(_disposableObserver);

我的问题是组合器函数不会被触发,除非所有 3 个输入字段 observable 都至少发出一次。因此,当用户输入了错误的电子邮件地址时,他们只有在所有 3 个字段中输入一些数据后才会收到通知。

combineLatest() 必须具有开始发射某些东西的所有值,因为根据定义,组合器函数获取从 n 个源发射的 n 个值。

当 RxBInding 用 RxTextView 包装 TextView 事件时,它会在订阅时发出一个初始值(TextView 的内容),所以如果没有 skip(1),您将有你想要的逻辑,问题是这个示例中的验证逻辑不期望,并且显示空值错误(通过 !isEmpty(newXXX) 检查)。
基于明确的 skip(1) 转换,我的直觉是,在这个例子中,这是期望的行为——意味着当所有字段都已输入时,我们需要显示错误。

在你的情况下,如果你想实现你的逻辑,你需要跳过显示错误的空值,同时仍然在最后发出 false 因为整个输入还无效,然后 - 有任何变化在任何独立于其他字段的字段中,如果不为空,您将出错。