@Ayk72

Как сделать чтобы скрипт не дублировал запросы?

Добрый день!

Как сделать, чтобы скрипт не отправлял на сервер запрос, пока не закончил 1 запрос?

Есть скрипт, который обрабатывает действия в форме. Если нажать на checkbox 4 раза, то он будет в порядке очереди 4 запроса отправлять, каждый по 3 секунды с анимацией. Как сделать, чтобы пока выполняется хотя бы 1 запрос, скрипт очередь вообще не создавал. Игнорировал действия формы.

$(document).ready(function(){
    var $form = $('#filter'),
        $controls = $form.find('input,select,textarea');

    $controls.on('change', function(){
         startLoadingAnimation();
        $.post("/engine/ajax/filter.php", $("#filter").serialize(), function(response){
           
           setTimeout(function(){$('#dle-content').html(response); stopLoadingAnimation();}, 3000);
    });
             });
});
         
         
 function startLoadingAnimation() 
{
   $("#dle-content").append('<div id="res"><img src="http://katushka.in.ua/templates/katushka2/images/ajax-loader.gif" /></div>');
}
          
function stopLoadingAnimation() 
{
   $("#res").remove();
}


Спасибо!
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Arik
Если человек сделал n-действий, то будет ждать, пока пройдет вся очередь из n-действий? Как минимум можно сделать таймер, который делает запрос через n-секунд, если пользователь больше ничего не менял. А чтоб очереди не было, то можно как вариант отменять старые запросы, так как уже не нужны, юзер что-то поменял
var currentAjaxRequest;

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
    if(options.abortOnRetry) {
        if(currentAjaxRequest  && currentAjaxRequest.readyState != 4) {
        currentAjaxRequest.abort();
        }
    
    currentAjaxRequest = jqXHR;
    }
});
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Всё зависит от конкретной логики приложения.
Самое простое - отключать контролы на время выполнения запроса:
$(document).ready(function () {
    var $form = $('#filter'),
        $controls = $form.find('input,select,textarea');

    $controls.on('change', function () {
        var $control = $(this);
        
        $control.prop('disabled', true)
        
        startLoadingAnimation();
        
        $.post(
            "/engine/ajax/filter.php",
            $("#filter").serialize(),
            function (response) {
                setTimeout(function () {
                    $('#dle-content').html(response);
                    stopLoadingAnimation();
                }, 3000);
        	}
        ).always(function () {        	
        	$control.prop('disabled', true)
        });
    });
});

function startLoadingAnimation() {
    $("#dle-content").append('<div id="res"><img src="http://katushka.in.ua/templates/katushka2/images/ajax-loader.gif" /></div>');
}

function stopLoadingAnimation() {
    $("#res").remove();
}
Ответ написан
@GreatRash
Надо установить флаг, что запрос пошел, и снимать его как только пришел ответ от сервера.

// ...

var processing = false; // флаг

$controls.on('change', function() {
  if (processing) return; // если флаг есть, то выходим из обработчика

  processing = true; // устанавливаем флаг
  startLoadingAnimation();

  $.post("/engine/ajax/filter.php", $("#filter").serialize(), function(response) {
    processing = true; // снимаем флаг как только пришел ответ от сервера

    setTimeout(function() {
      $('#dle-content').html(response);
      stopLoadingAnimation();
      
      // или в этом месте (в зависимости от задачи)
    }, 3000);
  });
});

// ...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы