2010-12-06 40 views
0

我正在处理我遇到的问题,我见过一些人也在苦苦挣扎。我需要一些基于Facebook的功能,如按钮事件。所以我捕捉到了点击按钮的事件,并用ajax调用了我的函数。但是在每次单击时,我的函数被多次调用,从3到8不等。问题是这个函数创建的模型应该是唯一的,并且由于即时多次调用 - 我得到多个对象。 如何防止这种情况?我试过设置全局变量,但没有任何运气:如何在短时间内无线程锁定多个ajax请求的功能

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> 

回答

0

如果我得到你的问题是正确的,我想你应该在JavaScript中定义一个全局变量。假设您有一个全局变量busy,应该在发送请求时设置该参数,并在请求完成时取消设置。

在每次请求之前,您应该检查变量是否已设置,以及它的集合是否不再发送请求。