我有一个投票脚本,当我一次投票时它工作正常,但是当我尽可能快地对许多项目进行投票时,一些故障并停止,我该怎么做才能防止这种情况发生?我只希望一次有一个进程并等待进程完成再进行另一个进程。
$.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);
});
}
});
答案 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)
你可以在身体上显示loading
或spinning
图像,以避免下一次ajax调用。
$.ajaxStart(function() {
$("img#loading").show();
});
$.ajaxComplete(function() {
$("img#loading").hide();
});
答案 3 :(得分:0)
点击后立即禁用或隐藏投票按钮。然后,在AJAX请求的成功和错误函数中,启用或再次显示它。
看起来你已经在错误功能中做了类似的事情。