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
因为整个输入还无效,然后 - 有任何变化在任何独立于其他字段的字段中,如果不为空,您将出错。
我正在关注 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
因为整个输入还无效,然后 - 有任何变化在任何独立于其他字段的字段中,如果不为空,您将出错。