2011-05-16 148 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