2011-02-22 29 views
0

我在alertbox彈出窗口中不斷定義...我是否缺少某些東西?並且有關於nodeArray[0]的數據,因爲如果我將它放在for循環中,它會正確提醒。在嵌套函數之間傳遞數組()

function other(){ 
    oNodeArray = grabNodes(env, poolName); 
} 

回答

3

Ajax調用異步

function grabNodes(env, poolName){ 
    var env = "dev"; 
    var nodeArray = new Array(); 

    var ajaxRequest; //initialize ajax object 

    var browser = navigator.appName; //find the browser name 
    if(browser == "Microsoft Internet Explorer"){ 
     /* Create the object using MSIE's method */ 
     ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    else{ 
     /* Create the object using other browser's method */ 
     ajaxRequest = new XMLHttpRequest(); 
    } 

    // Create a function that will receive data sent from the server 
    ajaxRequest.onreadystatechange = function(){ 
     if(ajaxRequest.readyState == 4){ 
     // Get the data from the server's response 
     //what on this page is changing 
      var xmlRes=ajaxRequest.responseXML.documentElement; 
      try { 
       for(var i=0; i<xmlRes.getElementsByTagName('node').length;i++){ 
        nodeArray[i] = xmlRes.getElementsByTagName('node')[i].firstChild.nodeValue; 
       }//end for loop 
      } 
      catch (err){ 
      } 
      alert(nodeArray[0]); 
     } 

    } 

//return nodeArray; 
} 

函數的調用。 alert(nodeArray[0]);執行之前您分配給ajaxRequest.onreadystatechange的功能。

alert放在回調中,它會起作用(只要你得到一個有效的響應)。 每個必須對結果進行操作的代碼都必須從回調中調用。

更新:您無法返回數據。你必須重構你的代碼才能使用回調。

如果您當前的代碼是這樣

oNodeArray = grabNodes(env, poolName); 

// work on `oNodearray` 

你必須將其更改爲:

grabNodes(env, poolName, function(oNodearray) { 
    // work on `oNodearray` 
}); 

和Ajax回調有打電話給你傳遞的功能和數組傳遞給它:

function grabNodes(env, poolName, callback){ 
    //.... 
    ajaxRequest.onreadystatechange = function(){ 
     // stuff 
     callback(nodeArray); 
    } 
} 

因爲Ajax調用是異步的,所以它們不會阻止代碼的執行。您需要傳遞一個函數,一旦收到數據就會執行該函數。


的進一步說明:

  • 使用var nodeArray = [];初始化一個數組。
  • var env = "dev";會影響參數env。如果要指定一個默認值,做

    env = env || 'dev'; 
    
+0

所以我提出了警報,它給我的數據,所以我知道它的工作。但是我不理解退貨聲明......如果我把它放在那裏它返回到哪裏?我需要它返回到另一個函數中的oNodeArray,它調用grabNodes() – Jim 2011-02-22 21:00:39

+0

@Jim:你不需要在回調中放置一個return語句,它將不起作用。請看我更新的答案。 – 2011-02-22 21:02:51

+0

當您在ajax回調中設置數組時,grabNodes()已經返回。您需要重新編寫代碼,以便您可以使用nodeArray作爲ajax回調的參數調用給定的函數。你試圖以同步的方式編程它,但是ajax在定義上並不是同步的。 – 2011-02-22 21:07:24

0

Ajax調用是最有可能不是在調用警報尚未完成。這應該放在onreadystatechange處理程序中。