2011-02-22 30 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处理程序中。