jquery abort () ajax-запрос перед отправкой другого - PullRequest
26 голосов
/ 23 июля 2010

На основе: Прервать 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>

Ответы [ 4 ]

61 голосов
/ 23 июля 2010

Создать очередь массива всех ваших запросов.Затем, если вы найдете точку, где вам нужно прервать все существующие запросы, вы можете просто перебрать массив и вызвать abort для всех ожидающих запросов.Должно быть довольно просто.

Хотя другой способ - просто сохранить внутренний флаг, который указывает, обрабатывается ли в данный момент запрос, и пропустить его, если он есть.Или обработайте, как считаете нужным.

РЕДАКТИРОВАТЬ: проверьте этот вопрос SO для аналогичной ситуации: Как избежать 3 вызовов ajax?

РЕДАКТИРОВАТЬ 2: Итак, я, что выможет сделать это иметь массив, к которому вы добавляете все ваши вызовы ajax.По сути, это просто создание XmlHttpRequest, и это то, что возвращается из вызова ajax.Так что

requests.push(
    $.ajax({
        type: 'post',
        url: '/test.php',
        data: search_data,
        success: function(data) {
            $('#catalog').html(data);
        }
    }));

Это добавит все ваши запросы в массив запросов, который вы можете определить где-нибудь.Затем, когда вы захотите убить все ожидающие запросы, вы можете просто перебрать массив и вызвать abort, который прервет запрос.

for(var i = 0; i < requests.length; i++)
    requests[i].abort();

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

Надеюсь, этого достаточно для начала работы.

23 голосов
/ 31 июля 2012

Ответ 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);
        }
    });
}
4 голосов
/ 23 июля 2010

Довольно просто с jQuery AjaxManager Plugin :

$.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) {}});
2 голосов
/ 23 июля 2010

Используйте глобальную переменную для хранения дескриптора текущего запроса. В этом случае объявите var a вне функции и сделайте ее глобальной. Перед вызовом проверки ajax он не равен нулю. Если оно не равно нулю abort, то в противном случае присвойте ему новый ajax. В случае успеха / завершения убедитесь, что вы очистили переменную a. Возможно, это не лучшее решение, но лучше всего работает.

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