Функция вызова JQuery, когда все запросы AJAX завершены - PullRequest
3 голосов
/ 23 июля 2011

Мой вопрос - вариант вопроса здесь

Однако есть два различия:

  1. Я не знаю, сколько существует AJAX-запросов. Наверняка их не меньше 10. Они выполняются одновременно или почти одновременно, и число запросов меняется каждый раз.

  2. Функция, которую я хочу вызвать, также выполняет запросы AJAX. Я не хочу, чтобы запросы AJAX продолжались вечно (именно это и произошло, когда я впервые попробовал). Я хочу эту функцию только один раз.

Вот мой код:

$("#calculateButton").ajaxComplete(function() {
    $(this).unbind();
    $(this).click();
});

Итак, что я попытался сделать, это прикрепить обратный вызов ajaxComplete к кнопке вычисления. Проблема в том, что это выполняется каждый раз, когда завершается ajax-запрос. Тогда как я хочу, чтобы функция выполнялась, когда все AJAX-запросы завершены.

Есть ли способ сделать это. Когда я пишу это, это звучит запутанно. Должен ли я просто сдаться и создать хакерский обход?

Ответы [ 3 ]

8 голосов
/ 23 июля 2011

Используйте .ajaxStop() вместо вашего текущего метода.

$("#calculateButton").ajaxStop(function() {
    $(this).unbind(); // $(this).unbind("ajaxStop") -> this is not needed as unbind will remove everything, but leaving it here as an FYI
    $(this).click();
});

http://api.jquery.com/ajaxStop/

Примечание: Обновлен код выше для остановки бесконечного цикла.

0 голосов
/ 23 июля 2011

Вероятно, вам следует создать некоторую локальную переменную, которая будет доступна из каждого запроса . Давайте назовем его ajaxCount и присвоим ему 0 (ноль) в начале.

Для каждого запроса, который вы хотите считать тем, который блокирует вашу функцию, увеличивает ajaxCount на один . В обратном вызове, выполняемом, когда этот конкретный запрос завершен (с ошибкой ИЛИ с успехом), уменьшает ajaxCount на 1 (один) .

Кроме того, в каждом упомянутом выше обратном вызове, просто после того, как вы уменьшите ajaxCount, вызовите другую функцию , которая будет проверять, равно ли ajaxCount 0 (ноль), Если результат теста положительный (это означает, что в данный момент AJAX-запрос не выполняется), сделайте то, что вы хотели.

Это основная идея, реализация довольно проста. Пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы по этому поводу.

0 голосов
/ 23 июля 2011

Вы можете использовать отложенные объекты [документы] , представленные в jQuery 1.5.

Как настроить это, зависит от того, какВы делаете вызовы Ajax, но в целом это что-то вроде:

$.when(callAjaxA(), callAjaxB(), callAjaxC(), ...).then(callAjaxFinal);

, где функции callAjaxX будут возвращать объект обещания, возвращаемый $.ajax.Вы также можете легко добавлять новые вызовы через pipe [документы] .

Это будет выполнено callAjaxFinal после выполнения всех запросов.в callAjaxX закончили.

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