承诺在一系列真/假值中失败

时间:2016-05-09 18:07:42

标签: javascript jquery arrays ajax promise

我有一系列验证检查,其中一个正好使用ajax来检查地址。在提交表单之前,我需要整个数组返回true并依次触发。我尝试使用承诺但无济于事。

这是问题所在。如果我输入的地址不正确或将输入留空,则表示不提交表格(好)。但是当我实际输入有效地址时,表单提交,尽管validations数组中的其他验证都有错误的值。我做错了什么?

var validations = [validateInputPresence, validatePassword, validateAddress];

$continueButton.on('click', function() {    
  toggleSpinner();

  subscribe().then(function() {
    submitForm(); // This is firing even when some values are false in the array
  }, function() {
    toggleSpinner();
  });
});

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));
}

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);

        hasValidAddres ? resolve() : reject();
      }, 
      error: function() {
        toggleSpinner();
      }
    });
  });
}

function validateInput(validation) {
  if (validation) {
    return true;
  } else {
    return false;
  }
}

2 个答案:

答案 0 :(得分:1)

主要问题是你没有在validateInput()函数中返回Promise。你不能通过在其中一个函数中返回false来拒绝Promise.all返回的promise。 Read more about Promise.all,以下引用来自MDN

  

如果在可迭代数组中传递的东西不是一个promise,它将由Promise.resolve转换为一个。

实际上是什么,但Promise将被视为已经解决。

你应该做的是编写validateInput函数来返回一个promise。

function validateInput(validation) {
  return new Promise(function(resolve, reject) {
    if (validation) { 
      resolve();
    } else {
      reject();
    }  
  });
}

答案 1 :(得分:0)

  

我做错了什么?

您从未测试过数组中的值是select SUM (timetaken) FROM actions WHERE faultid IN (select Faultid from Faults WHERE requestnumber = '6') -- ^^ 还是true。你正确地完成了大部分的承诺,false返回一个布尔值数组的承诺。如果您想测试是否所有这些都是真的,您需要明确地这样做:

subscribe()