防止同时发生ajax请求

时间:2011-12-20 07:02:26

标签: jquery 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);
                });
            }
        });

4 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分:1)

也许在函数内部,第一行应该是停用调用函数的按钮或链接,以及最后一行来激活它。那样在函数仍在运行时调用函数是不可能的......

答案 2 :(得分:1)

你可以在身体上显示loadingspinning图像,以避免下一次ajax调用。

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

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

答案 3 :(得分:0)

点击后立即禁用或隐藏投票按钮。然后,在AJAX请求的成功和错误函数中,启用或再次显示它。

看起来你已经在错误功能中做了类似的事情。

相关问题