2013-01-17 168 views
1

可能重複:
How do you make javascript code execute *in order*我的javascript代碼不按照正確的順序執行

var cek = false; 

function checkForm() 
{ 
    var user = document.forms["LoginForm"]["user"].value; 
    var pwd = document.forms["LoginForm"]["pwd"].value; 
    AJAXfunc("checkidpass.php?id="+user+"&pass="+pwd,function() 
    { 
     if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) 
     { 
      $("#LoginRes").html(xmlhttp.responseText); 
      if (xmlhttp.responseText == "") 
       cek = true; 
     } 
    }); //---> 1 

    return cek; //---> 2 
} 

我要問爲什麼 「返回CEK;」 (第2部分)在AJAXfunc(第1部分)之前執行?我想知道如何使它以正確的順序執行。

感謝您的幫助!

+11

「AJAX」中的第一個「A」代表** Asynchronous **。 – Pointy

+0

任何想法如何使它按正確的順序執行?謝謝 – darkstallion

+0

@darkstallion如果你不確定如何去想它,可以把它想象成「窗口」。setTimeout',你不知道'ms'的值。 –

回答

2

要了解您的問題,您需要了解異步方法。一個簡單的谷歌會給你一個過多的閱讀材料。我建議從這裏開始:

Mastering Ajax, Part 2: Make asynchronous requests with JavaScript and Ajax

提示:你現在正在做什麼會永遠工作 - 除非你選擇,使之同步功能(不推薦)。

+0

'提示:你現在正在做的事情將永遠不會工作即使你修改了'AJAXfunction's ['open's](https:/ /developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#open%28%29)第三個參數爲'false'? :0 –

+0

@PaulS。,我認爲最好避免同步和異步討論,並將OP指向可以教導問題根源的資源。然而根據你的評論,我已經更新了我的提示。我原來的陳述是正確的,但他們現在正在做的事情將永遠不會奏效。 –

+0

@JamesHill謝謝你的鏈接:D – darkstallion

0

這是因爲AJAX調用是異步的。

AJAXfunc呼叫在return語句之前執行,但您在AJAXfunc呼叫中提供的匿名功能稍後調用。

return聲明之前使回調運行的方法是使AJAX調用同步。然而,這通常不是一個好主意,因爲這會讓瀏覽器在等待響應時凍結。

通常的方式來處理,這是在checkForm功能使用回調:

function checkForm(callback) { 
    var user = document.forms["LoginForm"]["user"].value; 
    var pwd = document.forms["LoginForm"]["pwd"].value; 
    AJAXfunc("checkidpass.php?id="+user+"&pass="+pwd,function() { 
    if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) { 
     $("#LoginRes").html(xmlhttp.responseText); 
     callback(xmlhttp.responseText == ""); 
    } 
    }); 
} 

用法:

checkForm(function(cek) { 
    if (cek) { 
    // ok 
    } else { 
    // not ok 
    } 
}); 
+0

如果'xmlhttp.readyState!= 4'會發生什麼?你的回調將永遠不會被調用! – drinchev

+0

@drinchev:是的,該狀態不是在原始代碼中處理的。結果將是(如果它已經工作)該變量將是未定義的。 – Guffa

+0

是的,它將是未定義的,但你的'checkForm(函數(cek){if(cek){// ok} else {//這將永遠不會被調用}});'對嗎? – drinchev

0

JavaScript是異步如此異步功能,如你AJAXfunc不會阻止你程序,直到完成。這就是爲什麼事件和回調在JavaScript中大量使用。

例如你的回調代碼看起來像這樣:

function checkForm(callback) 
{ 
    var user = document.forms["LoginForm"]["user"].value; 
    var pwd = document.forms["LoginForm"]["pwd"].value; 
    AJAXfunc("checkidpass.php?id="+user+"&pass="+pwd,function() 
    { 
     if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) 
     { 
      $("#LoginRes").html(xmlhttp.responseText); 
      if (xmlhttp.responseText == "") 
       return callback(true); 
     } 
     return callback(false); 
    }); 
} 

checkForm(function (result) { 
    var cek = result; 
    // Rest of your code for manipulating DOM or something else where you need cek. 
}); 
0

你最好重新構造你的代碼,當你得到響應時觸發回調。

即。 1.化妝checkForm具有回調參數 2.激活與結果回調 3.具有在回調的代碼的其餘部分,而不是功能

的返回例如以下:

// before (wrong): 
result = checkForm(); 
handleResult1(result); 
handleResult2(result); 

// after (correct): 
checkForm(function(result) { 
    handleResult1(result); 
    handleResult2(result); 
}