2011-12-20 15 views
2

投票スクリプトがあり、一度に1つずつ投票するとうまくいきますが、できるだけ早く多くのアイテムに投票すると、何らかの不具合が発生して停止します。 ?私は一度に一つのプロセスしか持っておらず、別のプロセスを作る前にプロセスが終了するのを待っていました。同時の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だけでなく、任意の言語)は、引数をキューまたはスタックに入れてから一度に1つずつ送信することです。このような

サムシング(擬似コード):

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

次のajax呼び出しを避けるために、loadingまたはspinningイメージを本文に表示することができます。

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

$.ajaxComplete(function() { 
    $("img#loading").hide(); 
}); 
関連する問題