Javascript передача массивов между вложенными функциями () - PullRequest
0 голосов
/ 22 февраля 2011

Во всплывающем окне оповещения я получаю неопределенное значение ... Я что-то упустил? И есть данные на 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 ]

3 голосов
/ 22 февраля 2011

Ajax-вызовы асинхронны .alert(nodeArray[0]); выполняется перед функцией, назначенной вами ajaxRequest.onreadystatechange.

Поместите alert в обратный вызов, и он будет работать (при условии, что вы получите правильный ответ). Каждый код, который должен работать с результатом, должен вызываться из обратного вызова.

Обновление: Вы не можете вернуть данные.Вы должны реструктурировать свой код для использования обратных вызовов.

Если ваш текущий код похож на

oNodeArray = grabNodes(env, poolName);

// work on `oNodearray`

, вы должны изменить его на:

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

и Ajaxcallback должен вызывать функцию, которую вы передаете, и передавать ей массив:

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

Поскольку вызовы Ajax являются асинхронными, они не блокируют выполнение кода.Вам нужно передать функцию, которая будет выполнена после получения данных.


Дополнительные комментарии:

  • Используйте var nodeArray = []; для инициализациимассив.
  • var env = "dev"; будет затенять параметр env.Если вы хотите присвоить значение по умолчанию, выполните

    env = env || 'dev';
    
0 голосов
/ 22 февраля 2011

Скорее всего, вызов ajax еще не завершен, когда вызывается предупреждение.Это должно быть помещено в обработчик onreadystatechange.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...