如何在短时间内防止多个Ajax请求重复调用函数而不使用线程
我遇到了一个问题,发现有些人也在为此苦恼。我需要一些功能,基于Facebook的点赞按钮事件。所以我捕捉到按钮被点击的事件,然后用ajax调用我的函数。但是每次点击按钮时,我的函数会被调用多次,次数从3到8不等。问题是这个函数创建的模型应该是唯一的,但因为瞬间被多次调用,我就得到了多个对象。
我该怎么防止这种情况发生呢?我试着设置全局变量,但没有成功:
def send_submission(request):
global BLOCKED
if BLOCKED == 0:
logging.debug("should be locked")
BLOCKED = 1
(... do something...)
BLOCKED = 0
html = render_page(request)
ajax = simplejson.dumps({
"html": html
}, cls=LazyEncoder)
return HttpResponse(ajax, mimetype='application/javascript')
还有js代码负责处理这个调用:
FB.Event.subscribe('edge.create', function(href, widget) {
$.ajax({
type: "POST",
url: "/submissions/add",
data: "href="+href+"&ip={{ IP_ADDRESS }}",
dataType: 'json',
success: function(data){
$("#submissions").html(data["html"])
}
});
return false;
});
我也试着用js来锁定这个操作,但也没有效果。
<script type="text/javascript">
window.fbAsyncInit = function() {
var maxAjaxCallAllowed=1;
var openAjaxCalls = new Array();
function insertHtml(data){
openAjaxCalls.pop();
$(".list-submissions").html(data["html"])
}
FB.init({appId: '161771113844567', status: true, cookie: true, xfbml: true});
FB.Event.subscribe('edge.create', function(href, widget) {
alert("glos");
if(openAjaxCalls.length < maxAjaxCallAllowed){
openAjaxCalls.push(1);
$.ajax({
type: "POST",
url: "{% url register_vote %}",
data: "href="+href+"&ip={{ IP_ADDRESS }}",
dataType: 'json',
success: function(data){
insertHtml(data);
}
});
}
else{
alert('Server call not possible at this time');
}
});
};
(function() {
var e = document.createElement('script');
e.type = 'text/javascript';
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
</script>
1 个回答
0
如果我理解你的问题没错的话,我觉得你应该在JavaScript里定义一个全局变量。比如,你可以有一个全局变量叫做 busy
,这个变量在发送请求时设置为“忙碌”,而在请求完成后再取消这个状态。
在每次发送请求之前,你应该先检查这个变量是否已经被设置。如果已经设置了,就不要再发送请求了。