Как вызвать функцию после завершения нескольких запросов AJAX на JQuery? - PullRequest
1 голос
/ 07 марта 2011

Я вызываю несколько запросов ajax одновременно.У меня есть одна функция, которая вызывает сервер, получает ответ и обрабатывает его.Основываясь на переданных ему параметрах, я решу, что будет возвращено на стороне сервера.

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

Я связал jQuery http://api.jquery.com/jQuery.when/, но функция в .then() вызывается немедленно.

Вот что я пробовал:

$.when(GetAjaxData(someUrl1), GetAjaxData(someUrl2), GetAjaxData(someUrl3)).then(alert("done"), alert("not done"));

естьлюбой другой подход, который вы можете придумать?

Ответы [ 4 ]

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

Малоизвестный факт, $ .when () немедленно выполнит обратный вызов then (), если какой-либо из параметров потерпит неудачу.Чтобы процитировать документацию:

http://api.jquery.com/jQuery.when/

В случае множественных отсрочек, когда один из отложенных отклонен, jQuery.when немедленно запускает failCallbacks для своего главного отложенного элемента.Обратите внимание, что некоторые из отложенных могут все еще быть неразрешенными в этой точке.Если вам необходимо выполнить дополнительную обработку для этого случая, например отменить незаконченные запросы Ajax, вы можете хранить ссылки на базовые объекты jqXHR в закрытии и проверять / отменять их в failCallback.

Естьна самом деле нет встроенного способа ожидания, пока все они не будут завершены, независимо от их статуса успеха / неудачи.

Итак, я построил для вас $ .whenAll ():)

http://jsfiddle.net/InfinitiesLoop/yQsYK/

0 голосов
/ 29 января 2016
$(document).ajaxStop(function () {
    // or call the function which you want to call after all the ajax calls
}); 
0 голосов
/ 10 октября 2014

Вы хотите deferred.always () :

// Called when all deferreds are either resolved or rejected
$.when(
    $.ajax("/page1.php"),
    $.ajax("/page2.php"),
    $.ajax("/page3.php"))
.always(function() { alert("AJAX requests completed") });
0 голосов
/ 07 марта 2011

jQuery.when работает только при возврате объекта jQuery.Deferred, поэтому в вашей функции GetAjaxData вы хотите вернуть объект jqXHR (который является отложенным).

Примерно так:

function GetAjaxData(url) {
    return $.ajax({
        url: url,
        ... more options
    })
}

Это выполнит запрос AJAX и вернет объект jqXHR, который jQuery.when знает, как его использовать.

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