Javascript在嵌套函数之间传递数组()

时间:2011-02-22 20:43:43

标签: javascript ajax arrays function return-value

我在警告框弹出窗口中一直未定义...我错过了什么吗?并且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);
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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