webentwicklung-frage-antwort-db.com.de

JavaScript: Globale Variablen nach Ajax-Anfragen

die Frage ist ziemlich einfach und technisch:

var it_works = false;

$.post("some_file.php", '', function(data) {

     it_works = true;

});

alert(it_works); # false (yes, that 'alert' has to be here and not inside $.post itself)

Was ich erreichen möchte, ist:

alert(it_works); # true

Gibt es eine Möglichkeit, das zu tun? Wenn nicht, kann $.post() einen Wert zurückgeben, der auf it_works Angewendet wird?

47
Gal

AJAX steht für Asynchronous JavaScript und XML. Das Versenden an den Server erfolgt daher nicht synchron mit dem Rest der Funktion. Probieren Sie stattdessen einen Code wie diesen aus (er bricht nur die Kurzform $.post raus in den längeren $.ajax aufrufen und die Option async hinzufügen).

var it_works = false;

$.ajax({
  type: 'POST',
  async: false,
  url: "some_file.php",
  data: "",
  success: function() {it_works = true;}
});

alert(it_works);

Hoffe das hilft!

6
mattbasta

Es scheint, dass Ihr Problem einfach eine Nebenläufigkeit ist. Die Post-Funktion verwendet ein Callback-Argument, um Ihnen mitzuteilen, wann der Post beendet wurde. Sie können den Alert im globalen Bereich nicht wie folgt erstellen und erwarten, dass der Post bereits abgeschlossen ist. Sie müssen es in die Rückruffunktion verschieben.

5
Hosam Aly

Ihr Code schlägt fehl, weil post() eine asynchrone Anforderung an den Server startet. Das bedeutet für Sie, dass post() sofort zurückkehrt und nicht , nachdem die Anforderung abgeschlossen wurde, wie Sie es erwarten.

Was Sie dann brauchen, ist, dass die Anforderung synchron ist und den aktuellen Thread blockiert, bis die Anforderung abgeschlossen ist. Somit,

var it_works = false;

$.ajax({
  url: 'some_file.php',
  async: false,  # makes request synchronous
  success: function() {
    it_works = true;
  }
});

alert(it_works);
2
Jesse Dhillon