Как определить, когда закончится серия запросов GET? - PullRequest
0 голосов
/ 26 октября 2010

Я хотел бы выполнить серию запросов get, а затем выполнить некоторые действия после завершения всех запросов get. Ниже приведена начальная точка кода, который у меня есть, но поскольку запрос get является асинхронным, сразу же выполняется «выполнить некоторые действия после завершения всех запросов getJSON».

Как правильно / лучше всего это делать?

...
$.each(array, function(i, element) {
    // setup url and params
    $.getJSON(url, params, function(data) {
        // do work on data
    }
}
// do some action after all getJSON requests finish
...

Я подумал о том, чтобы иметь счетчик для числа элементов в массиве, уменьшить его и выполнить действие, когда оно достигнет нуля, но меня беспокоит, что операция не является атомарной и может привести к ошибкам. Ниже приведен пример того, о чем я думал, но я не уверен, что он всегда будет работать правильно.

...
$.each(array, function(i, element) {
    var items_remaining = array.length;
    // setup url and params
    $.getJSON(url, params, function(data) {
        // do work on data
        items_remaining = items_remaining - 1;
        if ( items_remaining === 0 ) {
            // do some action after all getJSON requests finish
        }
    }
}
....

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Если у вас есть контроль над сценарием обработки на стороне сервера, как насчет того, чтобы изменить его так, чтобы он принимал массив элементов, чтобы они могли обрабатываться партиями, вместо того, чтобы запускать один элемент за раз и нести все накладные расходы на установкувверх / сносит HTTP-вызов для каждого?С помощью этого единственного вызова вы можете заставить обработчик обратного вызова отключить логику «сделай что-нибудь после ...», и вам не придется беспокоиться, если вы уже достигли конца цикла .each().

Выполнениесинхронный вызов также гарантирует, что логика постобработки не будет выполнена, пока не будет выполнен вызов ajax.Но если обработка занимает «много времени», это блокирует браузер на время.Однако, просто поместив постпроцессор в функцию и вызвав эту функцию из обработчика ajax.

Помимо этого, ваш вариант со счетчиком - единственный другой практический вариант.

1 голос
/ 26 октября 2010

Не беспокойся об атомарности.Javascript является однопоточным в исполнении и параллельного доступа к «общим» данным просто не происходитВаш обратный вызов никогда не будет вызван одновременно.Ваш пример выглядит хорошо.

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