Запрос jquery abort() ajax перед отправкой другого
Исходя из: Отменить запросы Ajax с использованием jQuery... В inventory_search() - перед выполнением запроса ajax, как я могу проверить любые текущие запросы и прервать(), прежде чем делать новый запрос? Или... Есть ли лучший способ сделать это?
<script type="text/javascript">
$(function() {
$('form#internal_catalog').change(function() {
inventory_search();
});
});
function inventory_search() {
var search_data = $('form#internal_catalog').serialize();
var a = $.ajax({
type: 'post',
url: '/test.php',
data: search_data,
success: function(data) {
$('#catalog').html(data);
}
});
}
</script>
Ответы
Ответ 1
Создайте очередь массивов всех ваших запросов. Затем, если вы найдете точку, в которой вам нужно отменить все существующие запросы, вы можете просто пропустить массив и вызвать прерывание для всех ожидающих запросов. Должно быть довольно просто.
Хотя другим способом является просто сохранить внутренний флаг, который указывает, выполняется ли запрос в настоящий момент и пропустить запрос, если он есть. Или обрабатывайте, как вы сочтете нужным.
EDIT: проверьте этот вопрос SO для аналогичной ситуации: Как избежать 3 вызовов ajax?
EDIT 2: Итак, я могу сделать массив, в который вы добавили все ваши призывы ajax. По сути, это просто создание XmlHttpRequest, и это то, что возвращается из вызова ajax. Так
requests.push(
$.ajax({
type: 'post',
url: '/test.php',
data: search_data,
success: function(data) {
$('#catalog').html(data);
}
}));
Это добавит все ваши запросы в массив запросов, который вы можете определить где-нибудь. Затем, когда вы хотите убить все ожидающие запросы, вы можете просто пропустить массив и вызвать прерывание, которое убьет запрос.
for(var i = 0; i < requests.length; i++)
requests[i].abort();
Или просто определите переменную вне вашей функции, которая является флагом, указывающим, выполняется ли запрос. Вы даже можете сделать его более конкретным и сохранить данные поиска, а также пропускать запросы, у которых есть ожидающий запрос на одни и те же данные, и разрешать другие запросы, которые предназначены для разных данных.
Надеюсь, этого достаточно, чтобы вы начали.
Ответ 2
Ответ Spinon отлично подходит для прерывания всех запросов ajax, но не подходит для отслеживания только одного.
Я часто нахожу, что делаю что-то вроде
var ajax_request;
function do_something()
{
if(typeof ajax_request !== 'undefined')
ajax_request.abort();
ajax_request = $.ajax({
type: 'post',
url: '/test.php',
data: search_data,
success: function(data) {
$('#catalog').html(data);
}
});
}
Ответ 3
Довольно легко с jQuery Плагин AjaxManager:
$.manageAjax.create('unique_identifier',{
queue:'clear',cacheResponse:false,maxRequests:1,abortOld:true
});
jQuery.manageAjax.abort('unique_identifier');
jQuery.manageAjax.clear('unique_identifier');
jQuery.manageAjax.add('unique_identifier',{success: function(data) {}});
Ответ 4
Используйте глобальную переменную для хранения дескриптора текущего запроса. В этом случае объявите функцию var a
out и сделайте ее глобальной. Прежде чем вызывать проверку ajax, она не равна нулю. Если он не является нулевым abort
, он другой назначает ему новый ajax. В событии success/complete убедитесь, что вы очистили переменную a. Возможно, это не лучшее решение, но лучше всего работает.