2010-11-23 8 views
0

Dans le code suivant, je prends l'entrée d'un appel AJAX dans une fonction appelée plr(). Je veux détecter lorsque le chargement est terminé en utilisant la variable 'done'. Mais le thread principal verrouille la variable et le script bloque le navigateur . Si je mets l'alerte dans le lieu commenté, le but est servi. Alors, de quelle autre manière puis-je utiliser pour faire la même chose. Merci d'avance ..variable de partage javascript

function openX() { 
      LoadContentInto("Default.aspx", plr); 
      var obj = null; 
      done = false; 
      function plr() { 
       x = this.AJAXObject.responseText; 
       t = x.indexOf('{') 
       n = parseInt(x.substring(0, t)); 
       s = x.substring(t, n + t); 
       p = eval('(' + s + ')'); 
       obj = p; 
       done = true; 
      } 
      while (done != true) 
      { // alert("hello"); 
      } 
      alert(done); 
     } 
+0

Quelle bibliothèque utilisez-vous? Je ne connais pas ces noms. –

+0

ses téléiotes. Ma propre bibliothèque. – mihsathe

Répondre

1

Fondamentalement, vous devez faire synchrone votre appel ajax, donc il n'y a pas besoin de créer un vide (blocage) tout. le rappel plr() sera exécuté sur une réponse réussie, les données restantes sera appelée dans ce rappel

http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX

+0

@fcalderan AJAX synchrone est-il vraiment une bonne idée? –

+0

Oh merci ... j'ai vraiment oublié mon appel était asynch ... wow .. – mihsathe

+0

@fcalderan C'est bon. Mais est-ce de toute façon que je peux implémenter un écouteur d'événement comme ci-dessus avec un appel asynchrone? – mihsathe

0

Vous ne devriez pas attendre que le résultat activement. Lorsque l'appel AJAX est terminé avec succès, la fonction de rappel est appelée. Dans votre cas, il semble que c'est plr (bien qu'il ne soit pas clair ce que fait exactement LoadContentInto).

Il semble que vous ayez la tentation de synchroniser le callback AJAX. Parfois, j'avais l'habitude d'avoir de telles passions, mais jusqu'à présent, ça montrait toujours qu'il y avait aussi une manière asynchrone.

Peut-être que vous voulez quelque chose comme ça:

function openX() { 
    LoadContentInto("Default.aspx", plr); 
    var obj = null; 
    var done = false; // you have your variable global! Make it local! 
    function plr() { 
    x = this.AJAXObject.responseText; 
    // ... 
    // put your code here 
    // ... 
    alert("Done!"); 
    done = true; 
    } 
    setTimeout(function(){ 
    if (!done) { 
     alert("Please wait!"); 
     // Does the response and/or the operation after the responseText arives take a long time? 
     // Based on that decide how to inform the user 
    } 
    }, 100); // Set the timeout to right value.. based on your needs 
} 

Peu de commentaires à votre code:

  • vous avez done déclaré comme une variable globale, il est très probable qu'il devrait être local
  • while (done != true) est beaucoup plus propre que while (!done)
+0

Bien que cela puisse fonctionner dans certains cas, nous allons perdre la réponse ou le temps lorsque nous utilisons une valeur constante pour le temps. Ce que je veux, c'est l'application d'un écouteur d'événement. Quelque chose qui se passe quand vous flashez une alerte dans le fil en cours (mais sans afficher d'alerte bien sûr) .. – mihsathe

+0

Et s'il vous plaît pardonnez mon code. Je jouais juste avec le client pour json.net ne fait partie d'aucune bibliothèque – mihsathe

+0

@mihsathe les codes s'améliorent par la pratique. Je ne comprends pas votre problème des commentaires précédents. JavaScript aime les rappels, il s'agit plutôt d'écouter différents événements. C'est commun chez JS. Lorsqu'une requête AJAX est terminée avec succès, il y a aussi un rappel pour cela, c'est ce que vous appelez. – fifigyuri