2012-02-25 119 views
1

有沒有在下面的代碼中輸出所需的mlength在downloadURL()之外的方法?怎麼樣?AJAX可變範圍

var markers=new Array(); 
var mlength=0; 
downloadUrl("phpsqlajax_genxml.php", function(data) { 
    var xml = data.responseXML; 
    markers = xml.documentElement.getElementsByTagName("marker"); 
    mlength = markers.length; 
    alert(mlength); //output is not 0 (ex. 3) 
}); 
alert(mlength); //outputs 0 

回答

7

這是因爲根據定義,AJAX是異步的。在執行alert時,AJAX調用還沒有返回。您需要將使用mlength的任何代碼移至成功回調的內部。

另一種選擇是使AJAX請求同步,但這通常不是你想要的,因爲它往往會鎖定瀏覽器直到收到響應。

+1

+1解釋什麼,我編碼(他不應該採取的選項) – 2012-02-25 09:14:39

+0

謝謝你的美好的解釋......現在我明白了 – Jed 2012-02-25 09:29:38

+0

@JedLlenado - 沒問題, 很高興我能幫上忙 :) – 2012-02-25 11:39:58

1

簡單的答案是否定的。我假設downloadUrl是異步的,你無法控制這個(這意味着在你提供的回調之前發生警報)。

如果你真的需要輸出ouside(我強烈建議這個)。你可以做到這一點。

var markers=new Array(); 
var mlength=0; 
var req = new XMLHttpRequest(); 
req.open("phpsqlajax_genxml.php", false); 
req.send(); 
var xml = req.responseXML; 
markers = xml.documentElement.getElementsByTagName("marker"); 
mlength = markers.length; 
alert(mlength); //output is not 0 (ex. 3) 

雖然這是骯髒的髒代碼。

1

如果您想在XHR回調之外使用來自XHR的mlength,則必須等到它有值。你可以做,使用超時功能:

var markers = [] 
    ,mlength = null 
    ,showresult = function() { 
     if (mlength === null) { //=> no value, wait another 100 ms 
     setTimeout(showresult,100); 
     } else {    //=> there it is, alert it 
     alert(mlength); 
     } 
    }; 

downloadUrl("phpsqlajax_genxml.php", function(data) { 
    var xml = data.responseXML; 
    markers = xml.documentElement.getElementsByTagName("marker"); 
    mlength = markers.length; 
}); 

setTimeout(showresult,100);