Javascript if(function_foo())不等待function_foo()完成

时间:2009-10-12 09:48:58

标签: javascript jquery ajax if-statement

我有一个if语句:

    if(authenticate_session("secret_password12345")){
        alert("You are authenticated");
    }else{
        alert("Intruder alert!");
    }

和javascript身份验证功能,它对服务器进行jQuery POST AJAX调用以进行实际身份验证,并返回true或false:

function authenticate_session(session_id){
 $.post("/auth.php",
    { action: "authenticate_session", login_id: session_id },
    function(data){
        if(data == "denied"){
            alert("denied");
            return false;
        }else if(data == "accepted"){
        alert("accepted");
            return true;
        }
    },
"text");
}

但是,当if语句调用athentication函数时,它不会等待AJAX​​完成,并且总是执行'else'。如果我添加'return true;'进入认证函数的第一行,在ajax之前,if语句按预期执行=>警告(“您已通过身份验证”)。

我知道服务器端正常运行,因为正在按预期调用警报(“拒绝”)和警报(“已接受”)(但有趣的是,在if语句警报之后)。

如何使if语句等到身份验证功能完成?

谢谢!

4 个答案:

答案 0 :(得分:5)

它没有等待,因为默认情况下它是一个异步请求。将async option设置为false,使其同步。来自文档:

  

默认情况下,发送所有请求   异步(即设置为true)   默认情况下)。如果你需要同步   请求,将此选项设置为false。   请注意,同步请求可能   暂时锁定浏览器,   禁用任何操作时   请求已激活。

答案 1 :(得分:3)

我认为你不能让if语句“等待”ajax,只需将这个逻辑移动到ajax回调函数(好吧,你实际上已经做过:alert(拒绝|接受))

答案 2 :(得分:2)

之前说过。 Ajax使这些调用异步。等待它可能会锁定您的浏览器(不需要)。 因此,您应该使用回调方法来处理您的数据。这将使你的代码负责分离正确的东西。

function authenticate_session(session_id, callbacksuccess){
  $.post("/auth.php",
  { action: "authenticate_session", login_id: session_id },
  callback,
  "text");
}

function callback(data) {
  if (data == "denied") {
    alert('denied');
  } else if (data == "accepted") {
    alert('accepted');
  }
}

authenticate_session('secret_password12345", callback);

答案 3 :(得分:0)

感谢您的所有答案。

答案结果是ajax方法中的返回是从ajax方法返回的,而不是验证函数。