表单验证中未解决的承诺

时间:2019-01-03 14:13:55

标签: javascript ajax promise

我有一个JS函数-checkUsername-包括一个Ajax调用。它可以验证表单输入,还可以在提交表单时验证相同的输入:

function checkUsername(id) {
  var userName = $('#' + id).val().trim();
  if(!userName) {
    showErr(id, 'An entry is required.');
    return Promise.resolve(false);
  }
  return $.ajax({
    type: 'POST',               
    data:{'checkUsername': userName},
    url:'/php/ajax/validation-ajax.php',
  })
  .then(function(response) {
    if(response == 'notfound') {
      showErr(id, 'This user is not in the list.');
      return(false);
    }
    else {
      clearErr(id);
      return(true);
    }
  })
  .fail(function(err) {
    // some code
  })
}

在第一种情况下,由事件处理程序调用。在第二部分中,它构成switch语句的一部分:

case 'username':
  checkUsername(id).then(function(data) {
    if(isOK && data !== false) {
      // submit form
      $('form#adminusers').submit();
    }
  });
  break;

在表单提交的情况下,我认为功能诺言已得到正确处理。但是大概是当事件处理程序调用该函数时,promise仍然悬而未决。

这有关系吗?即使我编写了该函数的两个版本,一个用于事件处理程序,另一个用于表单提交,事件处理程序版本仍将在其中进行Ajax调用,因此Promise的情况也不会有所不同。

处理这种情况的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

要视情况而定。

最重要的部分是您完全兑现承诺。通常,当您找到未解决的承诺时,您真正的意思是错误状态没有得到解决。在您的特殊情况下,在switch语句中,看起来好像“良好”状态是通过提交表单来解决的,但是如果checkUsername或表单提交引发了任何错误,它将抛出未解决的拒绝。

最终,您应始终使用.fail().catch()-取决于您使用的Promises实现-在任何Promise链的末尾捕获在链中任何地方出现的错误。您可以有多个..在您的情况下,您在.fail()中有checkUsername(),可以用false解决该函数的承诺,但是您应该有另一个最后,以防万一表单提交中抛出任何错误。

答案 1 :(得分:0)

我认为在您的情况下,checkUsername(id)函数使用了已经解决所有承诺的ajax。因此,返回ajax将仅返回将执行的每个函数(如成功或失败)的return语句。所有的承诺都只在那里解决。

但是在switch语句的情况下,您正在对根本不返回诺言的函数调用诺言。即checkUsername(id).then(function(data) {});

在使用该函数之前,您首先必须确保该函数返回一个Promise。

因此,您的checkUsername(id)应该返回承诺:

checkUsername(id){
  return new Promise((resolve, reject) => { 
     // do something here
  });
}