пытаясь включить асинхронную схему - PullRequest
1 голос
/ 06 декабря 2011

У меня есть приложение, которое использует несколько экземпляров getJSON, и у меня много проблем. Однажды Пойнти предложил переработать основную подпрограмму для включения асинхронной обработки, и я согласен (теперь, когда я кое-что понимаю).

Прежде чем пытаться переделать это, оно было структурировано так:

Fill some arrays;
Call processArray to create a set of strings for each;
Stick the strings into the DIVs.

В процедуре processArray я вызываю $ .getJSON - пару раз, и вы, ребята, отметили, что у меня возникают проблемы с ожиданием значений, которые я не имею права ожидать. Общая процедура обрабатывает массив в сложную строку, но некоторые массивы должны быть отсортированы (нетрадиционно) в первую очередь. Моя оригинальная структура началась с вопроса: это массив для сортировки? Если так, я делал то-то и то-то, включая getJSON, затем возвращался к основной процедуре. То, что я сделал с массивом, не превзошло основную процедуру, которая продолжала видеть исходное содержимое массива.

Итак, этот ProcessArray был настроен так:

 function processArray(arWorking, boolToSort...) {
if(boolToSort) {do special stuff}
//continue on with processing
return complexString;
} 

Я подумал, что постараюсь гарантировать включение отсортированного массива в основную подпрограмму, заменив аргумент 'arWorking' функцией, которая выполняла сортировку , если processArray вызывался с boolToSort = true . По моему мнению, остальная часть основной подпрограммы будет продолжаться с одной из двух форм массива: переданный оригинал или отсортированный массив. Для этого я сделал процедуру сортировки отдельной процедурой: SortArray (arrayToUse).

Я придумал это:

function processArray( function(arWorking) {if(boolToSort) SortArray(arWorking); else return arWorking;}, boolToSort, ...) {
//main routine
return complexString;
}

Оба объекта - FireFox и IE9. FF переходит на jQuery, а IE9 хочет идентификатор в вызывающих аргументах. Что выглядит неправильно? Могу ли я использовать boolToSort в моей «функции аргумента»?

1 Ответ

0 голосов
/ 06 декабря 2011

Первая часть вас понимает это так:

$.getJSON() работает асинхронно. Это означает, что когда вы вызываете его, все, что он делает, это запускает операцию. Код, следующий за этой функцией, продолжает выполняться, пока вызов $.getJSON() работает в фоновом режиме. Через некоторое время результаты JSON будут доступны, и будет вызван обработчик успеха.

ТОЛЬКО в обработчике успеха вы можете использовать эти результаты.

Таким образом, вы не можете написать нормальный процедурный код, который делает это:

function processArray() {
    $.getJSON(url, function(data) {
        // only in here can you process the data returns from the getJSON call
    })
    // you cannot use the JSON data here as it is not yet available
    // you cannot return any of the JSON data from the processArray function

}

Вместо этого вы должны написать код, использующий обработчик успеха. Вот один из способов сделать это:

function processArrays(urlToProcess1, urlToProcess2, callbackWhenDone) {
    $.getJSON(urlToProcess1, function(data) {
        // only in here can you process the data returns from the getJSON call
        // do whatever you want to do with the JSON data here
        // when you are done process it, you can then make your next getJSON call
        $.getJSON(urlToProcess2, function(data) {
            // do whatever you want to do with the JSON data here
            // when done, you can then call your callback function to continue on with other work
            callbackWhenDone();
        });
    });
}

Еще одна вещь, которую вы не можете сделать, это:

function processArray() {
    var result;
    $.getJSON(url, function(data) {
        // only in here can you process the data returns from the getJSON call
        result = data;
    })
    return(result);
}

var data = processArray();
// code that uses data

Вы не можете сделать это, потому что данные результата не доступны, когда processArray () возвращает. Это означает, что вы не только не можете использовать его внутри processArray (но вне обработчика успеха), но вы не можете вернуть его из processArray () и не можете использовать его в коде, написанном после processArray (). Вы можете использовать эти данные только из обработчика успеха или из кода, вызываемого из обработчика успеха.

Если у вас была целая куча URL-адресов для обработки, и вы использовали один и тот же код для каждого из них, вы могли бы передавать массив URL-адресов и проходить через них, начиная следующий вызов getJSON, только когда был вызван обработчик успеха первого .

Если бы у вас была целая куча URL-адресов, каждый с разным кодом, вы могли бы передать массив URL-адресов и массив функций обратного вызова (по одному на каждый URL).

К вашему сведению, я не вижу проблем с передачей boolToSort. Мне кажется, что проблема в том, как вы обрабатываете асинхронные вызовы ajax.

Для полноты можно использовать синхронные вызовы ajax, но это НЕ рекомендуется, потому что это плохо для пользователя. Он блокирует браузер на время сетевых операций, что, как правило, не очень хорошо. Гораздо лучше использовать обычные асинхронные вызовы ajax и структурировать свой код для правильной работы с ними.

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