2010-12-06 4 views
0

Je suis confronté au problème que j'ai vu certaines personnes ont également du mal. J'ai besoin de fonctionnalités basées sur Facebook comme les événements de boutons. Donc, je attrape l'événement de cliquer sur le bouton et appelez ma fonction avec ajax. Mais à chaque clic, ma fonction est appelée plusieurs fois, variant de 3 à 8. Le problème est que cette fonction crée des modèles qui devraient être uniques, et à cause de l'appel multiple instantané - j'obtiens plusieurs objets. Comment éviter cela? J'ai essayé d'installer var global, mais sans chance:Comment verrouiller la fonction de plusieurs demandes ajax dans une courte période sans threads

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') 

Et les js accaparement l'appel:

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;  
    }); 

J'ai essayé avec verrouillage js, mais il ne fonctionne pas non plus.

<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> 

Répondre

0

Si je reçois votre question correcte, je pense que vous devez définir une variable globale en javascript. Supposons que vous ayez une variable globale busy qui doit être définie une fois qu'une demande est envoyée et désactivée lorsque la requête est terminée.

Avant chaque requête, vous devez vérifier si la variable est définie et si son ensemble n'envoie pas la demande à nouveau.

Questions connexes