2012-02-25 133 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);