在完成功能之前返回/使用ajax结果

时间:2019-02-23 11:21:42

标签: javascript jquery ajax asynchronous

作为表单验证过程的一部分,我试图检查输入到我的一个文本框中的值在数据库中是否已经存在。

我的Submit函数调用第二个验证函数,该函数使用ajax调用返回数据库中匹配的行数。如果行数等于0,我想返回true值。如果行数等于1+,我想返回false值。

由于ajax调用是异步运行的,所以我只会在ajax调用完成之前,函数完成时返回true。

阅读网络我知道我需要使用回调,但是可以弄清楚该做什么/如何重组我的代码。

提交按钮功能

(function() {
  $('#NewBookSave').on('click', function(e) {
    e.preventDefault();
    var newNameValidationResult = newNameValidation();
    alert("Validation = " + newNameValidationResult);

    // if validation = true submit form data.....
  });
}());

验证功能

function newNameValidation() {
  var newNameValue = $("#NewName").val();
  var nameCount;
  var isFormValid = true;

  $.ajax({
    type: "POST",
    url: "data_process.php",
    data: {
      dataDisplayType: 3,
      newNameValue: newNameValue
    },
    success: function(data) {
      nameCount = data;
    },
    complete: function() {
      if (nameCount >= 1) {
        showErrorMessage(newNameValue, "Error message");
        isFormValid = false;
      }
    }
  });
  return isFormValid;
};

3 个答案:

答案 0 :(得分:0)

使用async false来同步运行。

$.ajax({
    async: false,// other parameters as normal
})

答案 1 :(得分:0)

您可以从类似这样的内容开始。这是一个简单的回调函数,但是您可能想直接使用成功函数而不使用完整函数。如果您不知道,我可以为您重构代码。

var array = [],
    map = new Map;
    
console.log(Array.isArray(array)); //  true
console.log(Array.isArray(map));   // false
console.log(array instanceof Map); // false
console.log(map instanceof Map);   //  true

另一个选择是考虑使用promise而不是回调。

答案 2 :(得分:0)

您应该阅读有关成功和完成的内容。 Ajax之后有两个事件:成功或错误。如果成功,则执行成功的代码;如果出错,则执行错误的代码。但是无论如何,完整的代码都将执行。既然您依靠成功的号召,那么我将把代码放在一起成功。

只需在结果中提交表单,请注意成功的else语句:

SELECT id, up_date, top_list_end_date 
FROM advertisements
ORDER BY (CASE WHEN top_list_end_date < up_date OR top_list_end_date IS NULL
               THEN up_date
               ELSE top_list_end_date
          END) desc;