有没有办法在下面的代码中输出downloadURL()之外的所需mlength?怎么样?
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
答案 0 :(得分:7)
这是因为根据定义,AJAX是异步的。到alert
执行时,AJAX调用尚未返回。您需要将使用mlength
的任何代码移动到成功回调中。
另一个选择是使AJAX请求同步,但这通常不是你想要的,因为它往往会锁定浏览器,直到收到响应。
答案 1 :(得分:1)
简单的答案是否定的。我假设downloadUrl是异步的,你无法控制它(这意味着警报在你提供的回调之前发生)。
如果你真的需要输出输出(我强烈反对这一点)。你可以这样做。
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)
这是脏脏代码。
答案 2 :(得分: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);