【问题标题】:Javascript passing arrays between nested Functions()Javascript在嵌套函数()之间传递数组
【发布时间】:2011-02-22 20:43:42
【问题描述】:

我在警报框弹出窗口中一直未定义...我错过了什么吗? nodeArray[0] 上有数据,因为如果我将它放在 for 循环中,它会正确发出警报。

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;
}

函数被调用:

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

【问题讨论】:

    标签: javascript ajax arrays function return-value


    【解决方案1】:

    Ajax 调用是异步的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';
      

    【讨论】:

    • 所以我移动了警报,它给了我数据,所以我知道它正在工作。但我不理解 return 声明......如果我把它放在那里它会返回到哪里?我需要它返回到另一个调用 grabNodes() 的函数中的 oNodeArray
    • @Jim:你不需要在回调中放一个return语句,它不会有任何效果。请查看我的更新答案。
    • grabNodes() 在您在 ajax 回调中设置数组时已经返回。您需要重新编写代码,以便可以使用 nodeArray 作为 ajax 回调的参数调用给定函数。您正在尝试以同步方式对此进行编程,但 ajax 根据定义不是同步的。
    【解决方案2】:

    调用警报时,ajax 调用很可能尚未完成。这应该放在 onreadystatechange 处理程序中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 2019-04-18
      • 1970-01-01
      • 2016-12-15
      • 2018-04-09
      • 2014-02-27
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多