Отменить все запросы jQuery AJAX по всему миру
Есть ли способ отменить все запросы Ajax глобально без дескриптора объекта запроса?
Я спрашиваю, что у нас довольно сложное приложение, в котором мы запускаем несколько различных запросов Ajax в фоновом режиме с помощью setTimeOut(). Если пользователь нажимает на определенную кнопку, нам нужно остановить все текущие запросы.
Ответы
Ответ 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'
}