2011-05-16 144 views
1

好的,所以我似乎无法在通过ajax之后更改systemPath的全局变量。它将在ajax中工作,但我需要更新ajax之外的变量。基本上我试图从XML创建一个路径数组,并使用它们来查找其他可以从中生成表的XML文件。全局变量不会从AJAX成功内的函数更新

有人知道这里发生了什么吗? 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

Ajax的异步运行。事情在您的代码中按此顺序执行。 $.ajax()

  • $.ajax()发起一个Ajax调用

    1. 之前的东西(在等待响应继续运行该代码的其余部分)
    2. 东西后 $.ajax()
    3. 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); 
    }); 
    
  • +0

    那么,这将是项存放到AJAX生成的,然后是一个数组的最佳方式能够在页面中稍后使用它们? – 2011-05-16 20:40:55

    +0

    理想情况下,您应该只从成功回调中访问它们。但是,如果您需要通过用户交互访问它们(如点击),您可以像现在这样在全局范围内保存它们(请注意,用户可能会点击太快,即在收到数据之前)。为了解决这个问题,你只能在收到数据时设置点击处理程序,并且在此之前链接不做任何动作... – 2011-05-16 20:50:32

    +0

    这是[jsFiddle示例](http://jsfiddle.net/danmana/y6XgY/)你的情况,所以你可以更好地理解流程 – 2011-05-16 20:51:07