2010-11-23 8 views
0

Im folgenden Code nehme ich die Eingabe eines AJAX-Aufrufs in eine Funktion namens plr(). Ich möchte erkennen, wenn das Laden mit der 'done'-Variable abgeschlossen ist. Aber der Haupt-Thread sperrt die Variable und das Skript hängt den Browser. Wenn ich den Alarm in den kommentierten Ort setze, wird der Zweck bedient. Also, welche andere Möglichkeit kann ich verwenden, um das gleiche zu tun. Vielen Dank im Voraus ..sharing variable 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

Welche Bibliothek benutzen Sie? Ich bin mit diesen Namen nicht vertraut. –

+0

seine teleiotes. Meine eigene Bibliothek. – mihsathe

Antwort

1

Grundsätzlich müssen Sie synchrone Ihren Ajax-Aufruf machen, so dass es keine Notwendigkeit, eine leere (Blockierung), während zu erstellen. der Rückruf plr() wird auf erfolgreiche Antwort ausgeführt werden, dann wird verbleibenden Daten innerhalb dieser Rückruf

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

+0

@fcalderan Ist synchrone AJAX wirklich eine gute Idee? –

+0

Oh danke ... Ich habe wirklich vergessen, mein Anruf war asynch ... wow .. – mihsathe

+0

@fcalderan Das ist gut. Aber kann ich irgendwie einen Event-Listener wie oben mit asynch-Aufruf implementieren? – mihsathe

0

Sie sollten nicht auf das Ergebnis warten, dass aktiv aufgerufen werden. Wenn der AJAX-Aufruf erfolgreich beendet wurde, wird die Rückruffunktion aufgerufen. In Ihrem Fall scheint es, dass es plr ist (obwohl es nicht klar ist, was LoadContentInto genau tut).

Es scheint, dass Sie eine Versuchung haben, den AJAX-Erfolgsrückruf synchron zu machen. Manchmal hatte ich solche Leidenschaften, aber es hat sich immer gezeigt, dass es auch einen asynchronen Weg gibt.

Vielleicht möchten Sie etwas wie folgt aus:

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 
} 

Ein paar Kommentare zum Code:

  • Sie haben done als globale Variable deklariert, ist es sehr wahrscheinlich, dass es lokal sein sollte
  • while (done != true) ist viel sauberer als while (!done)
+0

Obwohl dies in einigen Fällen funktionieren könnte, werden wir entweder die Antwort oder die Zeit verlieren, wenn wir einen konstanten Wert für die Zeit verwenden. Was ich will, ist die Anwendung eines Ereignis-Listeners. Etwas, das passiert, wenn Sie eine Warnung im aktuellen Thread blinken lassen (aber ohne dass eine Warnung angezeigt wird). – mihsathe

+0

Und bitte verzeihen Sie meinen Code. Ich spielte gerade mit Client für json.net nicht Teil einer Bibliothek – mihsathe

+0

@mihsathe die Codes werden durch Praxis besser. Ich verstehe dein Problem nicht von den vorherigen Kommentaren. JavaScript mag Rückrufe, es geht darum, verschiedene Ereignisse zu hören. Das ist in JS üblich. Wenn eine AJAX-Anfrage erfolgreich abgeschlossen wurde, gibt es auch einen Rückruf dafür, den Sie anrufen. – fifigyuri