如何使函数等待jquery ajax完成

时间:2014-03-19 23:10:33

标签: jquery ajax

我有一个登录表单,当用户点击提交按钮时,我有一个主要功能,我打电话来决定是否应该迁移该页面。在main函数中,我调用了另外两个函数:一个用于检查用户名和密码字段是否为空,第二个函数有一个ajax,用于检查用户名和密码的组合是否正确:问题是带有ajax的函数由于main函数没有等待内部函数与ajax完成(异步),因此无法正常工作: 这是示例代码:

<h3 id="myerror" style="display:none;">Invalid username or password</h3>

<form action="mylogin.php" onSubmit="return mymain()">
username<input type="text" id="myuname">
password:<input type="password" id="mypass">
</form>

//and the script

<script>

function mymain() {
    if (is_not_empty() && is_in_database()) {
        return true;
    } else {
        return false;
    }
}

function is_not_empty() {
    var uname = $("#myuname").val();
    var pass = $("#mypass").val();
    if (uname == "" && pass == "") {
        $("#myerror").css("display", "block");
        return false;
    } else {
        return true;
    }
}

var a;

function isthere() {

    var uname = $("#myuname").val();
    var pass = $("#mypass").val();

    //the ajax php below returns either isthere or notthere with reference to the username 
    and password combination.

    $.post("http://localhost/passtester/pass1.php", {
        username: uname,
        password: pass
    }, function (feedbak) {
        a = feedbak;
    });
    if (a == "isthere") return true;
    if (a == "notthere") return false;
}
</script>

我将非常感谢您的帮助

3 个答案:

答案 0 :(得分:1)

使用成功功能

   $.ajax({

    success: function(data){

    },
    error: function(error){

    }
 });

答案 1 :(得分:1)

您的问题属于这一部分:

$.post("http://localhost/passtester/pass1.php", {username:uname,password:pass}   
,function(feedbak)
{
   a=feedbak;
});
if(a=="isthere")
  return true;
if(a=="notthere")
  return false;
}

您的条件超出了回调函数的范围,并且在处理ajax请求之前将被调用:

应该很可能是这样的:

$.post("http://localhost/passtester/pass1.php", {username:uname,password:pass}   
,function(feedbak)
{
  a=feedbak;

  if(a=="isthere")
     return true;
  if(a=="notthere")
     return false;
  }
});

更好的方法是在jquery中使用$.ajax()函数,而不是使用简写$.post。这样,您就可以访问.success.error个事件。在这种情况下,当用户名/密码错误时,您将使用api在登录成功(.success)或401(未授权)或类似的东西时返回200。这样,您可以轻松区分成功尝试和错误尝试。并且可以通知用户发生了什么

希望这有帮助。

答案 2 :(得分:1)

您无法从异步方法返回值,而是需要使用类似

的回调方法
function mymain() {
    if (is_not_empty()) {
        is_in_database(function (isthere) {
            if (isthere) {
                $('form').submit();
            }
        })
    }
    return false;
}

function is_not_empty() {
    var uname = $("#myuname").val();
    var pass = $("#mypass").val();
    if (uname == "" && pass == "") {
        $("#myerror").css("display", "block");
        return false;
    } else {
        return true;
    }
}

function is_in_database(callback) {

    var uname = $("#myuname").val();
    var pass = $("#mypass").val();

    //the ajax php below returns either isthere or notthere with reference to the username     and password combination.

    $.post("http://localhost/passtester/pass1.php", {
        username: uname,
        password: pass
    }, function (feedbak) {
        callback(feedbak == "isthere")
    });
}