Подтвердить что ты не робот

Отменить все запросы jQuery AJAX по всему миру

Есть ли способ отменить все запросы Ajax глобально без дескриптора объекта запроса?

Я спрашиваю, что у нас довольно сложное приложение, в котором мы запускаем несколько различных запросов Ajax в фоновом режиме с помощью setTimeOut(). Если пользователь нажимает на определенную кнопку, нам нужно остановить все текущие запросы.

4b9b3361

Ответ 1

Вам нужно вызвать метод abort():

var request = $.ajax({
    type: 'POST',
    url: 'someurl',
    success: function(result){..........}
});

После этого вы можете прервать запрос:

request.abort();

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

Также посмотрите:

Ответ 2

Вы не можете отменить все активные запросы Ajax, если вы не отслеживаете их.

Но если вы его отслеживаете, то да, вы можете это сделать, перейдя через ваши обработчики и называя .abort() на каждом из них.

Ответ 3

Вы можете использовать этот script:

// $.xhrPool and $.ajaxSetup are the solution
$.xhrPool = [];
$.xhrPool.abortAll = function() {
    $(this).each(function(idx, jqXHR) {
        jqXHR.abort();
    });
    $.xhrPool = [];
};

$.ajaxSetup({
    beforeSend: function(jqXHR) {
        $.xhrPool.push(jqXHR);
    },
    complete: function(jqXHR) {
        var index = $.xhrPool.indexOf(jqXHR);
        if (index > -1) {
            $.xhrPool.splice(index, 1);
        }
    }
});

Проверьте результат на http://jsfiddle.net/s4pbn/3/.

Ответ 4

Этот ответ на связанный с нами вопрос - это то, что сработало для меня:

fooobar.com/info/34748/...

Обратите внимание на первую строку, где @grr говорит: "Использование ajaxSetup неверно"

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

// Most of this is copied from @grr verbatim:
(function($) {
  var xhrPool = [];
  $(document).ajaxSend(function(e, jqXHR, options){
    xhrPool.push(jqXHR);
  });
  $(document).ajaxComplete(function(e, jqXHR, options) {
    xhrPool = $.grep(xhrPool, function(x){return x!=jqXHR});
  });
  // I changed the name of the abort function here:
  window.abortAllMyAjaxRequests = function() {
    $.each(xhrPool, function(idx, jqXHR) {
      jqXHR.abort();
    });
  };
})(jQuery);

Затем вы можете вызвать window.abortAllMyAjaxRequests();, чтобы прервать их все. Убедитесь, что вы добавили .fail(jqXHRFailCallback) в ваши запросы ajax. Обратный вызов будет "отменен" как textStatus, чтобы вы знали, что произошло:

function jqXHRFailCallback(jqXHR, textStatus){
  // textStatus === 'abort'
}