почему мой массив не определен? - PullRequest
0 голосов
/ 07 декабря 2011

В основном приложении, над которым я работал и с которым гуру Stack Overflow были спасателями, я решил избежать некоторых асинхронных осложнений, которые я видел, разделив ветвь SortArray моей основной подпрограммы на ее собственная функция. Тестирование, которое показывает отличные результаты непосредственно перед тем, как функция возвращает эти результаты.

Способ, который позволяет мне сэкономить на обработке, состоит в том, что я могу отсортировать массив до того, как Я отправлю его в основную функцию обработки. Таким образом, все массивы обрабатываются одинаково во всей функции ProcessArray.

В приведенном ниже примере кода я показываю текущую структуру, которая является моей интерпретацией данного совета (совсем недавно jfriend00). Я делаю два вызова $ .getJSON, второй в предложении success первого, и перед тем, как завершить первый вызов getJSON (в этот момент я протестировал и проверил массивы, созданные во время обработки, не показанной здесь), я вызываю SortArray в одном из массивов, затем передайте его подпрограмме, которая отправляет результат в ProcessArray.

Несмотря на успех кода SortArray внутри самого себя , массив, который входит в ProcessArray с помощью этого средства, помечается как «неопределенный». Если это не более проблем с асинхронной обработкой, я предполагаю, что это проблема со ссылкой на массив. Но я не знаю, как это решить.

function buildTree(centralID) {
  $(document).ready(function(){
    $.getJSON('MurakiMaida.json', function(data) {
        $.each(data.person, function(i, xdata) {
        ...create a small set of arrays
        }); //end of first $.each() routine
        $.getJSON('MurakiMaida.json', function(data) {
            $.each(data.person, function(i, xdata) {
            ...use an array just created to create another
            }); //end of second each()
        }); //end of second getJSON
        $("#spchildren").html(ProcessArray(SortArray(childIDs, true), centralID, false));
    }); //end of first getJSON
}); //document.ready
}

1 Ответ

1 голос
/ 07 декабря 2011

Если я правильно понимаю ваш код (большое, если), это проблема с асинхронной обработкой. Функция результатов вашего второго вызова Ajax создает массив child, верно?

Но функция результатов вызова Ajax вызывается не позже. Вы вызываете функцию ProcessArray сразу.

добавлены Может быть, это поможет:

Ваш код (если я правильно понимаю) точно такой же, как и следующий, за исключением того, что я называю функции, а не определяю их в строке:

var async_function_1 = function(data) {
   $.each(data.person, function(i, xdata) {
   ...create a small set of arrays
   }); //end of first $.each() routine

   $.getJSON('MurakiMaida.json', async_function_2);

   $("#spchildren").html(ProcessArray(SortArray(childIDs, true), centralID, false));
   // See the problem? You are calling ProcessArray before async_function_2
   // has a chance to run. 
} 

var async_function_2 = function(data) {
   $.each(data.person, function(i, xdata) {
   ...use an array just created to create another
   }); //end of second each()
};

function buildTree(centralID) {
    $(document).ready(function(){
        $.getJSON('MurakiMaida.json', async_function_1);
}); //document.ready
}

Исправление Переместите код ProcessArray в конец определения второй асинхронной функции следующим образом:

# Same as above except

var async_function_1 = function(data) {
   $.each(data.person, function(i, xdata) {
   ...create a small set of arrays
   }); //end of first $.each() routine

   $.getJSON('MurakiMaida.json', async_function_2);
} 

var async_function_2 = function(data) {
   $.each(data.person, function(i, xdata) {
   ...use an array just created to create another
   }); //end of second each()
   $("#spchildren").html(ProcessArray(SortArray(childIDs, true), centralID, false));
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...