2009-10-12 49 views
1

我有一個if語句:的Javascript如果(function_foo())不會等待function_foo()來完成

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​​完成,始終執行「其他」。如果我添加'返回true'進入認證功能的第一行,在ajax之前,if語句按預期執行=> alert(「您被認證」)。

我知道服務器端運行正常,因爲警報(「拒絕」)和警報(「接受」)按預期被調用(但有趣的是,在if語句警報之後)。

如何讓我的if語句等到認證功能完成?

謝謝!

回答

5

這不是因爲這是一個默認的異步請求。將async option設置爲false以使其同步。從文檔:

默認情況下,所有的請求被髮送 異步(即這是默認設置爲true )。如果您需要同步 請求,請將此選項設置爲false。 請注意,當 請求處於活動狀態時,同步請求可能會暫時鎖定瀏覽器 以禁用任何操作。

+0

這個答案聽起來很不錯,但是將事情設置爲同步並沒有解決問題。奇怪吧? – doctororange 2009-10-12 12:54:11

+0

這與我的答案一起,是票。 – doctororange 2009-10-12 13:00:14

+0

你永遠不應該從瀏覽器進行同步呼叫。在瀏覽器中使用XHR時暴露同步功能是該組件設計中最大的一個錯誤。 – NickFitz 2009-10-12 16:59:58

3

我不認爲你可以讓if語句「等待」 AJAX,只要將這種邏輯到AJAX回調函數(當然,你其實根本就:警報(否認|接受))

+0

謝謝 - 那些只是爲了調試。 – doctororange 2009-10-12 09:57:40

+0

我不明白爲什麼這個asnwer還沒有被投票。同步「Ajax」(Sjax?)調用通常是令人煩惱的來源。設置回調函數是更爲優雅的解決方案。 – Duroth 2009-10-12 10:01:59

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); 
0

感謝您的所有答案。

答案原來是ajax方法中的返回從ajax方法返回,而不是認證功能。