Как заблокировать функцию из нескольких запросов AJAX за короткий промежуток времени без потоков - PullRequest
0 голосов
/ 06 декабря 2010

Я имею дело с проблемой, которую я видел, что некоторые люди также борются. Мне нужны некоторые функции на основе 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 голосов
/ 06 декабря 2010

Если я правильно понял вашу проблему, я думаю, что вы должны определить глобальную переменную в javascript.Допустим, у вас есть глобальная переменная busy, которая должна быть установлена ​​после отправки запроса и сброшена при завершении запроса.

Перед каждым запросом следует проверять, установлена ​​ли переменная и не устанавливает ли она запрос повторно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...