Meine Arbeit war in letzter Zeit etwas einfacher. Ich erinnerte mich an ein Wortversprechen, das ich immer zuvor gesehen habe, also ging ich hinunter, um es geduldig zu studieren.
1: Was ist ein Versprechen? Warum ist dieses Ding dort?
Erstens wird Versprechen erstellt, um das Problem des Code -Schreibens während der asynchronen Programmierung von JavaScript zu lösen.
Mit der Entwicklung von JavaScript gibt es immer mehr asynchrone Szenarien. Das vordere Ende hat Ajax, SetTimeout usw. und der Backend -Knoten ist asynchron. Nach traditioneller Praxis ist es, Rückrufe in verschiedene Rückrufe einzubetten. Code kann Menschen schwindelig machen.
Zu diesem Zeitpunkt schlug die CommonJS -Community eine Spezifikation namens Promise/A+vor, die definiert, wie man asynchroner Code schreibt, einschließlich der Verwendung von wann/dann/löst usw., um asynchronen Code zu organisieren.
Da diese Spezifikation sehr elegant ist, haben viele Menschen diese Spezifikation nacheinander implementiert, einschließlich des in jQuery, wenn.js usw.
Da diese Bibliotheken diese Spezifikation erfüllen, lernen Sie einfach einen. Ich habe hauptsächlich JQuery aufgeschoben, daher spricht dieser Artikel hauptsächlich über diese Implementierung.
Zwei: JQuery ist aufgeschoben
Zuallererst schrieb Herr Ruan Yifeng über das aufgeschobene Objekt ausführlich einen Artikel, bitte klicken Sie hier. Es wird empfohlen, zuerst seinen Artikel zu lesen und dann weiter zu lesen.
Wie oben erwähnt, sind Versprechen so konzipiert, dass sie asynchron (z. B. Ajax) lösen. Vergleichen wir also ihre Unterschiede.
Der klassische jQuery ajax ist geschrieben als
Die Codekopie lautet wie folgt:
$ .ajax ({{{
Typ: "Get",
URL: "",
Erfolg: function () {},
Fehler; function () {}
});
Die Erfolgs- und Fehlerparameter sind Rückruffunktionen, wenn Erfolg/Misserfolg.
Jetzt ist die Ajax -Schreibmethode von JQuery geworden
Die Codekopie lautet wie folgt:
$ .ajax ({{{
Typ; "erhalten",
URL: ""
}). Done (function () {}). fail (function () {});
Nach dem Erfolg wird die Funktion in erledigt, und wenn die Funktion in Fail aufgerufen wird, wird die Funktion in Fail aufgerufen.
Nachdem Sie dies gesehen haben, haben Sie möglicherweise Fragen. Welches Objekt werden diese Methoden durchgeführt/scheitern? Welches Objekt kehrt $ .ajax () zurück und warum gibt es diese beiden Methoden?
Die Antwort befindet sich im nachstehend eingeführten aufgeschobenen Objekt.
JQuery bietet eine neue Art von Aufschiebung. Generieren mit $ .deferred (). Zum Beispiel
Die Codekopie lautet wie folgt:
var def = $ .deferred ();
Dieser Def erbt viele Methoden, einschließlich Fertig/Fail/Fail/Leser/List, usw.
Hier wissen wir also, dass das oben genannte $ .ajax () dieses Objekt tatsächlich zurückgibt.
Es gibt viele Methoden für aufgeschobene Objekte. Hier sind mehrere häufig verwendete. Weitere Informationen finden Sie in der API.
Das erste ist, natürlich ein Def -Objekt zu erzeugen. Es gibt hier viele Möglichkeiten, wie:
Die Codekopie lautet wie folgt:
var def = $ .deferred (); // generiere es selbst
$ .ajax ({}); // Die AJAX -Methode gibt auch ein DEF -Objekt zurück
$ .Wenn (); // Wenn die Methode auch ein DEF -Objekt zurückgibt
Hier kann $ .Wenn () separat gesprochen werden. Diese Methode empfängt normalerweise einen oder mehrere aufgeschobene Objekte und bestimmt dann den Status des von $ .when () zurückgegebenen Objekts basierend auf dem Status dieser aufgeschobenen Objekte. Eines der Nutzungsszenarien sind mehrere AJAX -Anfragen. Wenn einer von ihnen fehlschlägt, gilt dies als Misserfolg. Dann können Sie mehrere AJAX -Methoden in $ .when () wie $ .when ($. Ajax (), $ .ajax ()) übergeben. Dann wird $ .Wenn ein DEF -Objekt zurückgeben (beurteilt anhand der Ergebnisse dieser beiden Anfragen).
Dann erhalten Sie das Def -Objekt und es gibt eine Reihe von Methoden, um den Status dieses Objekts zu ändern.
Die Codekopie lautet wie folgt:
Def.Resolve (); // Setzen Sie das abgeschlossene Def -Objekt und dann wird die an def.done () gebundene Funktion sofort ausgeführt.
Def.Reject (); // Setzen Sie das Def -Objekt so fehlgeschlagen, und dann wird die an def.fail () gebundene Funktion sofort ausgeführt.
def.notify (); // Während der Ausführung des DEF -Objekts ist der entsprechende Rückruf von Def.Progress ().
Als Nächst
Die Codekopie lautet wie folgt:
def.done (); // entspricht Def.Resolve ();
def.fail (); // entspricht Def.Reject ();
Def.Progress (); // entspricht Def.Notify ();
// Besonders
def.always (); // gerufen, wenn er erfolgreich oder fehlgeschlagen ist
def.then (); // Akzeptiere mehrere Funktionen, in Ordnung, Erfolg, Misserfolg und Fortschritt
Tatsächlich ist die Verwendung des aufgeschobenen Objekts zu diesem Zeitpunkt fast gleich. JQuery liefert jedoch auch mehrere APIs
Die Codekopie lautet wie folgt:
// Überprüfen Sie die aktuelle Statusklasse
def.isRejected ();
def.isresolved ();
Def.State ();
Wie der Name schon sagt, werden diese APIs nicht im Detail diskutiert. Einzelheiten können Sie die oben angegebene Jquery -API -Dokumentation überprüfen.
Es gibt eine andere Methode, nämlich, dass wir manchmal ein externes DEF -Objekt angeben wollen, und dann kann dieses Objekt Rückrufe für verschiedene Zustände festlegen, aber seinen Zustand nicht ändern, damit wir es verwenden können.
Die Codekopie lautet wie folgt:
def.Promise ();
Geben Sie ein Promisee -Objekt zurück, bei dem es sich um eine Teilmenge des aufgeschobenen Objekts handelt. Sie können Fertig/Fail und andere Methoden ohne Auflösung/Ablehnung und andere Methoden verwenden. Es dient hauptsächlich, den Zustand des Def -Objekts vor Außenseite zu schützen.
Zu diesem Zeitpunkt wurden alle Versprechen diskutiert. Sie können sie jetzt in Ihren Projekten verwenden. Außerdem wünsche ich Ihnen schöne frühe Jahre im Voraus. Ich wünsche Ihnen allen ein glückliches Jahr des Schafs ^^.