如果数组中的值为false,则破坏Promise



我目前正在进行一个需要一点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

最新更新