Lösen Sie, dass die Rückruffunktion zu tief ist und die parallele Logik seriell ausgeführt werden muss. Ein Versprechen stellt das Endergebnis einer asynchronen Operation dar. Die Hauptmethode, um mit Versprechen zu interagieren, besteht darin, die Rückruffunktion über ihre dann () -Methode zu registrieren, um den Endergebniswert des Versprechens zu erhalten.
Zu den versprechenden Protokollen gehören Promisea und Promisea+
Definieren Sie ein Klassenversprechen
Definieren Sie die Attributwarteschlange und initialisieren Sie das leere Array []
Definieren Sie den Eigenschaftswert, initialisieren Sie NULL initialisieren
Definieren Sie den Status des Status der Eigenschaft und initialisieren Sie "ausstehend" (Standardwert).
Definieren Sie die Mitgliedsmethode getQueue (), Rückgabeattributwarteschlange
Definieren Sie die Mitgliedsmethode getStatus (), geben Sie den Attributstatus zurück
Definieren Sie die Mitgliedermethode setStatus (), setzen
Bestimmen, dass der Status erfüllt oder abgelehnt wird,
Setzen Sie die Statuseigenschaft this.status = Status
Legen Sie die Werteigenschaft auf. Value = Value || Null, wenn Sie den Wert nicht bestehen, ist er NULL
Definieren Sie das Freeze Variable FreezeObject
Definieren Sie die Mitgliedsmethode isFouthung (), um festzustellen, ob der aktuelle Zustand (abgeschlossen) ist (abgeschlossen)
Definieren Sie die Mitgliedsmethode iSRejected (), um festzustellen, ob der aktuelle Zustand (fehlgeschlagen) ist
Definieren Sie die Mitgliedsmethode iSpending (), bestimmen Sie den aktuellen Status Master (Warten).
Definieren Sie die Mitgliedsmethode dann (), übergebenen Parametern: einen überfüllten erfolgreichen Rückruf, fehlgeschlagener Rückruf von Onrejected
Definieren Sie zwei Rückruffunktionen: Handler -Objekt, Attribut erfüllt, abgelehnt
Definieren Sie die aufgeschobene Eigenschaft des Handlersobjekts, des aufgeschobenen Objekts
Stellen Sie fest, ob der aktuelle Zustand wartet. Wenn es wartet, legen Sie das Handlerobjekt in das Warteschlangenarray in die Warteschlangenwarteschlange
Wenn es sich nicht um einen Wartezustand handelt, rufen Sie die Verfahren () -Methode des Utils -Objekts auf, Parameter: Status,
Return Handler.Deferred.Promise -Objekt
Definieren Sie eine aufgeschobene Klasse
Definieren Sie das Attributversprechen und initialisieren Sie das Versprechensobjekt
Definieren Sie die Mitgliedsmethode Resolve (), übergeben Sie den Parameter: Ergebnisergebnis
Bestimmen Sie den Status des Versprechensobjekts als Warten und kehren Sie direkt zurück
Rufen Sie die Methode GetQueue () des Versprechensobjekts an, um das Warteschlangenarray zu erhalten
Schleifenarray
// Todo ruft die Werkzeugklasse -Utils auf. procedure () Methode, Parameter: "erfüllt", Element, Errinformation
Rufen Sie die Methode setStatus () des Versprechensobjekts auf, legen Sie den Status fest, die Parameter "erfüllt", Ergebnis
Definieren Sie die Mitgliedsmethode Ablehnung, Übergebener Parameter: ERR -Fehlermeldung
Bestimmen Sie den Status des Versprechensobjekts als Warten und kehren Sie direkt zurück
Rufen Sie die Methode GetQueue () des Versprechensobjekts an, um das Warteschlangenarray zu erhalten
Schleifenarray
// todo, rufen Sie die Werkzeugklasse -Utils an. procedure () Methode, Parameter: "abgelehnt", Element, Errinformation
Rufen Sie die Methode setStatus () des Versprechensobjekts auf, legen Sie den Status fest, die Parameter "erfüllt", Ergebnis
Definieren Sie die Tool Class -Utils, führen Sie sie sofort mit anonymen Funktionen aus und erhalten Sie ein Objekt
Gibt das Objekt zurück, es befindet sich eine Methodenprozedur () im Objekt
Definieren Sie die Verfahrensmethode (), übergebenen Parameter: Typzustandstyp, Handler -Prozessor -Array, Ergebnisergebnis
Holen Sie sich den Verarbeitungsfunktion Func in Handler [Typ]
Ich war schwindelig, als ich hier ankam. . .
Wie man verwendet:
Definieren Sie eine Funktion ajax, übergeben Sie den Parameter: URL -Pfad
Holen Sie sich das aufgeschobene Objekt und kommen Sie neu heraus
Der Code von AJAX zum Anfordern von Daten in der Rückrufmethode, die Daten zurückgibt
Wenn die methode resolve () des aufgeschobenen Objekts erfolgreich aufgerufen wird, Parameter: Return Data
Wenn die Methode der Ablehnung () des aufgeschobenen Objekts als fehlgeschlagen ist, ist Parameter: zurückgegebene Daten
Geben Sie das aufgeschobene Objekt zurück.
Rufen Sie AJAX () -Methode an, um das Versprechenobjekt zu erhalten, Parameter: URL,
Rufen Sie die dann () Methode des Versprechensobjekts auf, Parameter: Anonyme Funktion
Rufen Sie die AJAX () -Methode auf, um das Versprechensobjekt zu erhalten und dieses Objekt zurückzugeben
Einen Kettenanruf bilden
JS Teil:
<Script> // Versprechen Code -Teil (ich habe den Hundegürtel ausgewählt) Promise = function () {this.queue = []; this.Value = null; this.status = 'anhängig'; // anhängig erfüllte abgelehnt}; Versprechen. {this.status = s; this.Value = value || Null; this.queue = []; var freezeObject = Object.freeze || Funktion(){}; FreezeObject (this); // Der Zustand des Versprechens ist irreversibel} else {Neuen Fehler werfen ({message: "unterstützt den Status nicht:" + s}); }}; Versprechen.Prototype.isfullFilled = function () {return this.status === 'erfüllt';}; Promise.Prototype.IsRejeced = function () {return this.status === 'abgelehnt';} Verheißung.Prototype. function (ondrefilliert, onrejected) {var Handler = {'erfüllt': Onrefilled, 'abgelehnt': onRejeced}; Handler.deferred = new Deferred (); if (! this.ispending ()) {// Dies darf zuerst den Versprechungsstatus ändern und dann Rückrufe utils.procedure hinzufügen (this.status, Handler, this.Value); } else {this.queue.push (Handler); // kann dann mehrmals auf demselben Versprechen aufgerufen werden. Spezifikation 2.2.6} return Handler procedure = type, handler, result) {var func = Handler [Typ]; NewResult.then (Funktion (Daten) {// Def.Resolve (Daten); //}, Funktion (err) {// def.Reject (err); //}); // Wenn x erfüllt ist, erfüllen Sie das Versprechen mit dem gleichen Wert. Übergang (Def, "abgelehnt",}}} {Übergang (Def, Typ, Ergebnis); {Wurf neuer Fehler ({'message': "unterstützt nicht:" + type});}}; } var queue = this.promise.getQueue (); für (var i = 0, len = queue.length; i <len; i ++) {utils.procedure ('erfüllt', Queue [i], Ergebnis); } this.promise.setStatus ('erfüllt', result);}; deferred.prototype.reject = function (err) {if (! this.promise.ispending ()) {return; } var queue = this.promise.getQueue (); für (var i = 0, len = queue.length; i <len; i ++) {utils.procedure ('abgelehnt', Queue [i], err); } this.promise.setStatus ('abgelehnt', err);}/************************************************************************************************** var xhr = new xmlhttprequest (); xhr.onReadyStatechange = function () {if (xhr.readyState === 4) {if ((xhr.status> = 200 && xhr.status <300) || xhr.status === 304) {Def.resolve (xhr.Reffes. Fehler ({message: xhr.status})); }}}}}; xhr.open ('get', url, wahr); xhr.send (null); return def.promise;}ajax('test.php?act=1').then(function(data1) { console.log(data1);//handle data1 return ajax('test.php?act=2');}).then(function(data2) { console.log(data2);//handle data2 return ajax('test.php?act=3');}, function(err) oderPHP:
<? phpif ($ _ get ['act'] == 1) {echo json_encode (array ("code" => 200);} else if ($ _ get ['act'] == 2) {echo json_encode ("code" => 300);}, wenn ($ _ _ _ _ _ _ _ _ _ _ 'act [' act ['act [' act ['act [' act ['act [' act ['act [' act ['act [' act ['act [' act ['act ['] json_encode (array ("code" => 400));}Die obige Zusammenfassung des einfachen Lernens und der Verwendung von JavaScript -Versprechen ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.