我目前正在进行一个需要一点ajax的表单验证。在这篇文章的帮助下,我依次启动了每个验证。
现在,只要它在验证数组中看到一个假值,我就需要打破承诺,而不是不管数组中的真/假值如何都要完成。我如何才能在我现在拥有的基础上融入这个概念?
var validations = [validatePassword, validateName, validateAddress, ...];
$continueButton.on('click', function() {
subscribe().then(function() {
// Do something
}, function() {
// Show error
});
});
function subscribe() {
var promises = validations.map(function(validation) {
return validation();
});
return Promise.all(promises);
}
function validatePassword() {
var password = $password.val();
var format = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])[^+&n]{8,}$/;
return validateInput(format.test(password), $password);
}
function validateAddress() {
return new Promise(function (resolve, reject) {
$.ajax({
type: 'POST',
url: '/address/validate',
data: $form.serialize(),
dataType: 'json',
success: function(response) {
var hasValidAddres = response.Data === 200;
validateInput(hasValidAddres, $address);
hasValidAddres ? resolve() : reject();
},
error: function() {
// Show error
}
});
});
}
function validateInput(validation, $input) {
if (validation) {
$input.removeClass('invalid');
return true;
} else {
markAsInvalid($input);
// Was originally return false
return Promise.reject('Example Error');
}
}
function markAsInvalid($input) {
$input.addClass('invalid');
}
根据MDN:
承诺所有故障快速行为
如果其中一个元素被拒绝,并且Promise.all快速失败,则Promise.al被拒绝:如果您有四个Promise在超时后解决,其中一个立即拒绝,则Promise.all立即拒绝
因此,您的代码应该按原样工作;如果a验证失败,Promise.all将立即放弃并返回false。
您应该在其中一个验证器中以错误拒绝:
function validatePassword() {
if (invalidPassword) {
var err = new Error('Invalid passw');
return Promise.reject(err);
}
}
在其中一个验证器出错的情况下,在subscribe
函数中,不会调用then
块,但会调用catch
。