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

Запрос 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>
4b9b3361

Ответ 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. Возможно, это не лучшее решение, но лучше всего работает.