【问题标题】:RxJava2 Flowable.combineLatest behavior if all Flowables don't emitRxJava2 Flowable.combineLatest 行为,如果所有 Flowables 不发射
【发布时间】:2017-12-09 14:20:31
【问题描述】:

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

【问题讨论】:

  • 你刚刚尝试运行 RxJava-Android-Samples 代码吗?还是在此基础上编写新代码?
  • 我正在使用相同的代码进行学习。没有修改。如果您看到链接的代码,如果我从 Flowables 中删除了 skip(1) 调用,那么我可以根据需要收到错误通知 - 但是一旦我启动片段就会有错误通知(没有任何用户输入)。

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


【解决方案1】:

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

当 RxBInding 用RxTextView 包装TextView 事件时,它会在订阅时发出一个初始值(TextView 的内容),所以如果没有skip(1),你将拥有你想要的逻辑,事情就是验证此示例中的逻辑不希望出现这种情况,并显示空值错误(通过!isEmpty(newXXX) 检查)。
我基于显式skip(1) 转换的预感是,在本例中,这是所需的行为——这意味着当所有字段都输入后,我们需要显示错误。

在你的情况下,如果你想实现你的逻辑,你需要跳过显示错误的空值,同时仍然在最后发出false,因为整个输入还无效,然后 - 在任何独立的字段上进行任何更改其他的,虽然不是空的,但你会出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2019-05-19
    相关资源
    最近更新 更多