如何在短时间内防止多个Ajax请求重复调用函数而不使用线程

0 投票
1 回答
581 浏览
提问于 2025-04-16 08:06

我遇到了一个问题,发现有些人也在为此苦恼。我需要一些功能,基于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,这个变量在发送请求时设置为“忙碌”,而在请求完成后再取消这个状态。

在每次发送请求之前,你应该先检查这个变量是否已经被设置。如果已经设置了,就不要再发送请求了。

撰写回答