2009-09-25 13 views
187

Insbesondere, wie unterscheidet es sich von der Standardeinstellung (async: true)?Was macht "async: false" in jQuery.ajax()?

Unter welchen Umständen möchte ich async explizit auf false setzen, und hat das etwas damit zu tun, dass andere Ereignisse auf der Seite nicht ausgelöst werden?

+0

Ja, scheint mir, es sollte etwas anderes als "Ajax" (Asynchronous JavaScript und XML) aufgerufen werden, wenn es nicht asynchron ist ... – devlord

+0

ähnelt dieser Frage: [http: // Stackoverflow.com/questions/133310/how-can-ich-bekomme-jquery-to-perform-asynchron-eher-als-asynchron-ajax-req] (http://stackoverflow.com/questions/133310/how-can -i-get-jquery-to-perform-a-synch-eher als asynchron-ajax-req) macht den Aufruf synchron .... – CSharpAtl

+0

Asynchron bedeutet, dass das Skript eine Anfrage an den Server sendet und fortfährt Ausführung, ohne auf die Antwort zu warten. Sobald eine Antwort eingeht, wird ein Browser-Ereignis ausgelöst, das wiederum dem Skript erlaubt, zugehörige Aktionen auszuführen. – SagarPPanchal

Antwort

229

Hat es etwas mit verhindern, dass andere Ereignisse auf der Seite von Brennen zu tun?

Ja.

Wenn Sie async auf false setzen, muss die Anweisung, die Sie aufrufen, abgeschlossen sein, bevor die nächste Anweisung in Ihrer Funktion aufgerufen werden kann. Wenn Sie async: true setzen, beginnt diese Anweisung mit der Ausführung und die nächste Anweisung wird aufgerufen, unabhängig davon, ob die asynchrone Anweisung bereits abgeschlossen wurde.

Weitere Informationen finden sich: jQuery ajax success anonymous function scope

+10

Ich habe mich immer gewundert, wie dies erreicht wurde, da JavaScript kein Threading ist. – Matt

+1

Also ist es wie eine billige Möglichkeit, verzögerte Ausführung zu tun? – Lorenzo

+3

@ L.DeLeo - nein, überhaupt nicht - defereds sind eine andere Möglichkeit, die Komplexität von asynchronen Funktionsaufrufen zu verwalten - async: false * entfernt die Asynchronität des Aufrufs vollständig *. Der Aufruf von 'ajax' ** blockt ** - der folgende Code wird erst ausgeführt, wenn der Server geantwortet hat. –

15

Wenn Sie den asynchronen Abruf deaktivieren, wird Ihr Skript blockiert, bis die Anforderung erfüllt wurde. Es ist nützlich, um eine Reihe von Anfragen in einer bekannten Reihenfolge auszuführen, obwohl ich Async-Callbacks für sauberer halte.

+0

Joe: Das hängt davon ab, ob Sie irgendwelche Worker-Threads im Hintergrund haben. –

3

Ein Anwendungsfall ist ein ajax Anruf zu machen, bevor der Benutzer das Fenster schließt oder verlässt die Seite. Dies wäre so, als würden einige temporäre Datensätze in der Datenbank gelöscht, bevor der Benutzer zu einer anderen Site navigieren oder den Browser schließen kann.

$(window).unload(
     function(){ 
      $.ajax({ 
      url: 'your url', 
      global: false, 
      type: 'POST', 
      data: {}, 
      async: false, //blocks window close 
      success: function() {} 
     }); 
    }); 
+37

Keine Menge von JavaScript wird ein Browser-Fenster aus dem Schließen – jammykam

18

Async:False wird die Ausführung des Ruhecode halten. Sobald Sie die Antwort von Ajax erhalten, wird der Rest des Codes ausgeführt.

5

Von

https://xhr.spec.whatwg.org/#synchronous-flag

Synchrone XMLHttpRequest außerhalb der Arbeitnehmer ist in den Prozess der von der Web-Plattform entfernt werden, da sie nachteilige Auswirkungen auf die Endbenutzers Erfahrung hat. (Dies ist ein langer Prozess, der viele Jahre in Anspruch nimmt.) Entwickler dürfen für das async-Argument nicht false übergeben, wenn die globale JavaScript-Umgebung eine Dokumentumgebung ist. Benutzeragenten werden dringend gebeten, vor einer solchen Verwendung in Entwicklertools zu warnen und möglicherweise mit dem Auslösen einer InvalidAccessError-Ausnahme zu experimentieren, wenn diese auftritt. Die zukünftige Richtung besteht darin, XMLHttpRequests nur in Worker-Threads zuzulassen. Die Nachricht soll dazu eine Warnung sein.

71
  • async:false = Code pausiert. (Andere Code für das Rennen warten.)
  • async:true = Code fortgesetzt. (Nichts wird pausiert. Andere Code nicht warten.)

So einfach wie diese.

+2

JavaScript ist single-threaded. Nichts läuft parallel. – 4castle

+1

Sehr schöne Erklärung ... –