繁体   English   中英

全局变量不会从AJAX成功内的函数更新

[英]global variable won't update from function within AJAX success

好的,所以我似乎无法在通过ajax后更改systemPath的全局变量,它可以在ajax内部运行,但是我需要在ajax外部进行更新的变量。 基本上,我正在尝试从xml创建路径数组,并使用它们查找其他可以生成表的xml文件。

有人知道这是怎么回事吗? ajax是否在变量设置之前运行,这就是为什么ajax之后的数组长度为0的原因?

    var systemPath = new Array();
var techDigestArr = new Array();
var addToArray = function(thisarray, toPush){
    thisarray.push(toPush);
}

$.ajax({
    url: fullPath+"technical/systems/systems.xml",
    dataType: ($.browser.msie) ? "text" : "xml",
    success: function(data){
                            var xml;    
                            if (typeof data == "string") {
                               xml = new ActiveXObject("Microsoft.XMLDOM");
                               xml.async = false;
                               xml.loadXML(data);
                            } else {
                               xml = data;
                            }
                            $(xml).find("system").each(function(){
                                var urlString = fullPath + "technical/system_" + $(this).attr("id") + "/" + $(this).attr("id") + "tech-digest.xml <br />";
                                //alert(urlString);
                            $("#td-articles").append(systemPath.length + urlString);
                                addToArray(systemPath,urlString);
                                //systemPath.push(urlString);
                            });
                        $("#msg-output").append("total - " +systemPath.length);//Returns 48

                    },//END SUCCSESS
    error: function(){
        alert("Sorry - ");
        history.go(-1);
    }
});//END AJAX CALL
    $(document).ready(function(){
        //$("#msg-output").append("total - " + systemPath.length); Returns 0
    });

Ajax是异步运行的。 事情在您的代码中按此顺序执行。

  1. $.ajax()之前的内容
  2. $.ajax()启动一个ajax调用(在等待响应的同时,它继续运行其余代码)
  3. $.ajax()
  4. success回调

请注意,取决于通话速度有多快,通话3和4的顺序可能相反(此处不是这种情况)

因此,当执行$(document).ready() ,ajax调用可能尚未返回,因此成功回调中的代码没有机会执行。 如果您很幸运并且连接速度很快,那么响应可能会在文档准备好之前出现,但这不太可能。

就像这样,您可以看到全局变量被更新了,您可以设置一个超时:

$(document).ready(function(){
  setTimeout(function(){
    $("#msg-output").append("total - " + systemPath.length);
    //if the delay set below is more than the time between the ajax request and the server response than this will print the correct value 
  },2000);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM