Как узнать, когда завершены вызовы jquery $ .get ajax? - PullRequest
0 голосов
/ 24 февраля 2009

У меня есть веб-приложение php / mysql / jquery, которое выполняет 13 запросов ajax к различным API и сохраняет результат в таблице базы данных. Каждому результату я назначаю оценку, и когда все результаты завершены, я хочу отобразить «общую оценку».

Моя проблема в том, что я знаю, когда все запросы ajax завершены и все результаты готовы и готовы к подсчету.

Вот существующий рабочий процесс:

  1. Пользователь вводит данные в поле запроса и нажимает кнопку отправить.
  2. Страница перезагружается и вставляет «идентификатор сканирования» в таблицу «scan_index».
  3. Страница затем выполняет функцию jquery $ .get для каждого из 13 запросов (все запросы используют одну и ту же функцию javascript для выполнения своей работы).
  4. При возвращении каждого результата результат вставляется в таблицу «сканирования» с использованием ранее вставленного «идентификатора сканирования», чтобы разрешить сопоставление с правильным сканированием. Результат также отображается пользователю вместе с его результатом.

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

Но моя проблема в том, чтобы знать, когда начинать запрос, чтобы получить все итоги. Любой заданный запрос может занять до 10 секунд (мое заранее заданное значение тайм-аута) до завершения (или сбоя), но обычно для его завершения требуется всего около 3 секунд.

Итак, не зная, когда запрос будет завершен, как я могу узнать, когда все запросы были завершены?

Ответы [ 3 ]

4 голосов
/ 24 февраля 2009

Похоже, что ключевая информация, которую вы упускаете, - это функция обратного вызова $ .get. Вы можете указать функцию в качестве второго или третьего аргумента, который будет запускаться после завершения запроса

$.get('http://example.com/data', {'foo':'bar'}, function(resonseData){
    //code here will be called when the ajax call has completed
})

Таким образом, вы захотите установить переменную счетчика где-нибудь, которая будет увеличиваться на единицу для каждого сделанного запроса, а затем в обратном вызове уменьшит это значение на единицу.

Затем, после того как вы сделали последний запрос на получение, настройте наблюдатель с помощью setInterval, который будет периодически проверять (скажем, раз в секунду), чтобы увидеть, равен ли счетчик нулю. Если это так, вы сделали со всеми вашими запросами. Возможно, вы могли бы добавить эту проверку к самому обратному вызову $ .get, но похоже, что он может быть подвержен ошибкам синхронизации.

Это базовое решение, но его легко можно абстрагировать в более надежное / элегантное решение очередей.

2 голосов
/ 04 октября 2011

Используйте метод jquery ajaxStop ()

        $(document).ajaxStart(function () {
            //first ajax call started
        });

        $(document).ajaxStop(function () {
            //last ajax call stopped
        });
2 голосов
/ 24 февраля 2009

Вот еще один вариант. Код, возможно, нужно настроить, на самом деле я его не тестировал, но это начало.

var complete = 0;

function submitRequests () {
    $.get("http://server/query1", {"data": "for Query"}, processResult(1));
    $.get("http://server/query2", {"data": "for Query"}, processResult(2));
    //...
    $.get("http://server/query13", {"data": "for Query"}, processResult(13));
}

function processResults (query) {
    complete += Math.pow(2,(query-1));
    if (complete == 8191) {
        $.get("http://server/results", scanid, function() {
            //Show results
        })
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...