首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AJAX变量作用域

AJAX变量作用域
EN

Stack Overflow用户
提问于 2012-02-25 17:05:51
回答 3查看 184关注 0票数 1

在下面的代码中,有没有办法在downloadURL()之外输出所需的mlength?多么?

代码语言:javascript
复制
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 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-25 17:08:20

这是因为根据定义,AJAX是异步的。在执行alert时,AJAX调用还没有返回。您需要将所有使用mlength的代码移到成功回调中。

另一种选择是使AJAX请求同步,但这通常不是您想要的,因为它往往会在收到响应之前锁定浏览器。

票数 7
EN

Stack Overflow用户

发布于 2012-02-25 17:11:41

简单的回答是否定的。我假设downloadUrl是异步的,您无法控制这一点(这意味着警报发生在您提供的回调之前)。

如果你真的需要输出到外部(我强烈建议你这样做)。你可以做到的。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-02-25 17:15:28

如果希望在XHR回调之外使用来自XHR的mlength,则必须等到它具有值为止。您可以使用超时函数来完成此操作:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9442726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档