AJAX可变范围

时间:2012-02-25 09:05:51

标签: php javascript ajax

有没有办法在下面的代码中输出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 

3 个答案:

答案 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);