2017-11-29 3 views
2

Ich benutze dies seit Jahren, aber ich habe festgestellt, dass ich etwas sehr grundlegendes nicht verstehe. In jQuery können Sie einen Anruf wie folgt machen:Woher weiß jQuery, ob ein Callback an ein Ajax-Versprechen geknüpft wird?

$.post({url: url, success: callback}) 

und jQuery wird die Callback-Methode aufrufen, wenn der Post abgeschlossen ist.

Aber man kann es auch mit Versprechen Syntax wie folgt erreichen:

$.post(url).done(callback) 

Die Sache, die mich ist verwirrend ist: die post Methode funktioniert, ob es ein done Rückruf angebracht, so wie es das macht weiß, es ist ein?

Mit anderen Worten, ich könnte es verstehen, wenn Sie dies tun musste:

1 var jqxhr = $.post(url) 
2 jqxhr.done(callback) 
3 jqxhr.execute() 

Aber Linie 3 ist nicht erforderlich. Also wie ist die post in der Lage, ohne explizite execute Aufruf auszuführen, und rufen Sie noch die done Rückruf, wenn es eine , die später angehängt bekommt?

Antwort

2

jQuery gibt ein Promise-Objekt zurück. Dies geschieht sofort (Ajax ist asynchron, so dass die Rückgabe sofort erfolgt, während das Ergebnis des Ajax-Aufrufs im Allgemeinen um mindestens eine kleine Zeit verzögert wird).

Wenn Sie .done() aufrufen, rufen Sie das tatsächlich auf dem Versprechen, das von Ajax zurückgegeben wurde.

Wenn Sie dies nicht tun, kümmert sich jQuery überhaupt nicht, es macht nur die Ajax-Anfrage und löst (oder löst) schließlich das Versprechen-Objekt. Es hat keine Ahnung und muss nicht wissen, ob Sie sich dafür entschieden haben, das zu hören oder nicht.

Zusammenfassend, "done" nicht bekommen "später" in der Realität angefügt, obwohl oberflächlich die Art, wie der Code geschrieben wird, könnte Ihnen diesen Eindruck geben.

+2

Sie sagen also, dass dies funktioniert, weil der Post-Aufruf (Zeile 1) die Anfrage initiiert und sofort zurückkehrt. Dann ist Linie 2 auch sofort. Aber der eigentliche 'post' braucht etwas Zeit, so dass der' done'-Handler bei seiner Fertigstellung angehängt wird. Das macht Sinn. –

+0

Aber was würde passieren, wenn Sie ein ähnliches Designmuster wünschen, außer dass die Sache, auf die Sie warten, eine asynchrone Last benötigt, aber auch schon bereit ist, und so gab es keine Verzögerung? –

+1

AFAIK das kann nicht passieren - Sie können es versuchen, indem Sie Ihr eigenes Promise-Objekt erstellen, das sofort ohne Verzögerung aufgelöst wird. – ADyson

Verwandte Themen