2011-12-20 2 views
2

У меня есть сценарий для голосования, и он отлично работает, когда я голосую по одному, но когда я голосую по многим пунктам так быстро, как могу, некоторые неисправности и остановка, что я могу сделать, чтобы предотвратить это ? Я хотел только один процесс за один раз и дождаться завершения процесса, прежде чем сделать еще один.Предотвращение одновременных запросов ajax

$.ajax({ 
      type: 'POST', 
      dataType: 'json', 
      url: 'vote/now', 
      timeout: 15000, 
      context: this, 
      data: { 
       'postid': $(this).attr('data-id'), 
       'vote': value, 
       'token': current_token 
      }, 
      success: function(data,textStatus,jqXHR){ 
       $points.fadeOut(500,function(){ 
        $points.html(data); 
        $points.fadeIn(500); 
       }); 
      }, 
      error: function(){ 
       $points.fadeOut(500,function(){ 
        $points.html("Sorry, Try again"); 
        $this.find('button').removeClass('clicked').attr('disabled',false); 
        $points.removeClass('busy'); 
        $points.fadeIn(500); 
       }); 
      } 
     }); 
+3

Почему бы не отключить все ваши кнопки с jquery перед запросом, а затем включить их после запроса? –

ответ

0

Отключить или спрятать кнопку голосования, как только она будет нажата. Затем, в функции успеха и ошибки вашего запроса AJAX, включите или покажите его снова.

Похоже, что вы уже делаете что-то подобное в функции ошибки.

2

Общепринятая идиома (а не только Javascript, но любой язык) для сериализации сетевых запросов заключается в том, чтобы помещать аргументы в очередь или стек, а затем отправлять по одному.

Что-то вроде этого (псевдо-код):

var argumentStack = []; 
var isSending = false; 

function serialSend(data) { 
    argumentStack.push(data); 
    trySend(); 
} 

function trySend() { 
    if(!isSending && argumentStack.length > 0) { 
     var data = argumentStack.pop(); 

     isSending = true; 

     $.ajax(data, success, error); 
     // in success and error handlers do this: 
     // isSending = false; 
     // setTimeout(trySend, 0); 
    } 
} 
+0

Мне нравится идея использования булевых элементов. – Michelle

+0

Попробуй тогда –

+0

не могли бы вы объяснить, что делают .push() и .pop()? – Michelle

1

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

1

вы можете показать изображение loading или spinning над телом, чтобы избежать следующего вызова ajax.

$.ajaxStart(function() { 
    $("img#loading").show(); 
}); 

$.ajaxComplete(function() { 
    $("img#loading").hide(); 
});