如果所有Flowable都不发出,则RxJava2 Flowable.combine最新行为

时间:2017-07-05 19:14:21

标签: rx-java rx-android rx-java2

我正在关注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个输入字段可观察量至少发出一次,否则不会触发组合器功能。因此,当用户输入错误的电子邮件地址时,他们不会得到通知,直到他们在所有3个字段中输入了一些数据。

1 个答案:

答案 0 :(得分:2)

combineLatest()必须具有开始发射内容的所有值,因为根据定义,组合器函数获得从n个源发出的n个值。

当RxBInding用TextView包装RxTextView个事件时,它会在订阅时发出初始值(TextView的内容),因此如果没有skip(1),您将获得理想的逻辑,就是这个样本中的验证逻辑不要指望,并且显示空值的错误(通过!isEmpty(newXXX)检查)。
基于显式skip(1)转换的我的预感是,在这个例子中,这是期望的行为 - 意味着只要输入了所有字段,我们就需要显示错误。

在你的情况下,如果你想实现你的逻辑,你需要跳过显示错误的空值,同时仍然在最后发出false,因为整个输入尚未生效,然后 - 任何改变字段独立于其他字段,而不是空的,你会错误。