全局变量不会在AJAX成功中从函数更新

时间:2011-05-16 20:24:50

标签: javascript xml jquery

  

好的,所以我似乎无法在通过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
    });

1 个答案:

答案 0 :(得分:1)

ajax是异步运行的。事情按照您的代码中的顺序执行。

  1. $.ajax()
  2. 之前的内容
  3. $.ajax()启动ajax调用(等待响应时继续运行其余代码)
  4. $.ajax()
  5. 之后的内容
  6. success回拨
  7. 请注意,取决于调用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);
    });