【问题标题】:Promise failing in an array of true/false values承诺在一组真/假值中失败
【发布时间】:2016-09-04 11:44:09
【问题描述】:

我有一系列验证检查,其中一个恰好使用 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;
  }
}

【问题讨论】:

  • 能否展示函数的内容:validatePassword 和 validateAddress?
  • 我用validatePassword() 函数和validateInput() 函数更新了代码,显示了如何返回真/假值。
  • 验证密码似乎没有返回承诺
  • validation() 是在 subscribe() 内部循环的当前函数
  • 是的,我的错。我编辑了

标签: javascript jquery arrays ajax promise


【解决方案1】:

我做错了什么?

您从未测试过数组中的值是true 还是false。您正确地完成了大部分承诺,subscribe() 返回一个布尔值数组的承诺。如果你想测试它们是否都是真的,你需要明确地这样做:

subscribe.then(function(results) {
    if (results.every(Boolean)) // all are true
        submitForm();
    else // some are false
        …;
}, function(err) {
    // some validations threw an exception
});

【讨论】:

    【解决方案2】:

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

    如果在可迭代数组中传递的东西不是 Promise,它会被 Promise.resolve 转换为 Promise。

    所以实际上任何事情,但 Promise 将被视为已解决。

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

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

    【讨论】:

    • 现在看来表单提交不管了。
    • @CarlEdwards 我的错,你的订阅实现应该是正确的,所以用你的而不是我的。
    • 当前在validateInput() 函数中返回一个promise 的实现,我得到Uncaught (in promise) undefined 对于现在循环通过的每个验证。
    • 验证为假的时候没问题,你确定你把真传给了validateInput()吗?当输入无效时,您将收到该错误。
    • 很高兴知道。新的承诺,所以当我在控制台中看到错误时,我首先想到的是这是“我的错”。非常感谢你的帮助。 +1 帮助我摆脱困境。
    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 2017-11-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多