Ich habe Code gesehen, der aussieht wie:
myObj.doSome("task").then(function(env) {
// logic
});
Woher kommt then()
das?
javascript
Kay Pale
quelle
quelle
Antworten:
Die traditionelle Art, mit asynchronen Aufrufen in JavaScript umzugehen, waren Rückrufe. Angenommen, wir mussten drei Anrufe nacheinander beim Server tätigen, um unsere Anwendung einzurichten. Bei Rückrufen sieht der Code möglicherweise wie folgt aus (unter der Annahme einer xhrGET-Funktion, um den Server aufzurufen):
In diesem Beispiel rufen wir zuerst die Serverkonfiguration ab. Auf dieser Grundlage rufen wir dann Informationen über den aktuellen Benutzer ab und erhalten schließlich die Liste der Elemente für den aktuellen Benutzer. Jeder xhrGET-Aufruf übernimmt eine Rückruffunktion, die ausgeführt wird, wenn der Server antwortet.
Je mehr Verschachtelungsebenen wir haben, desto schwieriger ist es natürlich, den Code zu lesen, zu debuggen, zu warten, zu aktualisieren und im Grunde genommen damit zu arbeiten. Dies ist allgemein als Rückrufhölle bekannt. Wenn wir Fehler behandeln müssen, müssen wir möglicherweise jedem xhrGET-Aufruf eine andere Funktion übergeben, um ihm mitzuteilen, was im Fehlerfall zu tun ist. Wenn wir nur einen gemeinsamen Fehlerbehandler haben wollten, ist das nicht möglich.
Die Promise-API schlägt Folgendes vor:
promise
Objekt zurück.promise
Objekt verfügt über einethen
Funktion, die zwei Argumente annehmen kann, einensuccess
Handler und einenerror
Handler.then
Funktion wird nach Abschluss der asynchronen Task nur einmal aufgerufen .then
Funktion gibt auch a zurückpromise
, um die Verkettung mehrerer Aufrufe zu ermöglichen.value
, dasargument
in der Kette vonpromise
s an die nächste Funktion als a übergeben wird .promise
(eine weitere asynchrone Anforderung stellt), wird der nächste Handler (Erfolg oder Fehler) erst aufgerufen, nachdem diese Anforderung abgeschlossen wurde.Der vorherige Beispielcode könnte also unter Verwendung von Versprechungen und des
$http
Dienstes (in AngularJs) wie folgt übersetzt werden :Erfolg und Irrtum verbreiten
Das Verketten von Versprechungen ist eine sehr leistungsfähige Technik, mit der wir eine Vielzahl von Funktionen ausführen können, z. B. einen Dienst, der einen Server aufruft, eine Nachbearbeitung der Daten durchführt und die verarbeiteten Daten dann an den Controller zurückgibt. Aber wenn wir mit
promise
Ketten arbeiten, müssen wir einige Dinge beachten.Betrachten Sie die folgende hypothetische
promise
Kette mit drei Versprechungen, P1, P2 und P3. Jederpromise
hat einen Erfolgshandler und einen Fehlerhandler, also S1 und E1 für P1, S2 und E2 für P2 und S3 und E3 für P3:Im normalen Ablauf, in dem keine Fehler vorliegen, würde die Anwendung S1, S2 und schließlich S3 durchlaufen. Aber im wirklichen Leben sind die Dinge nie so glatt. Bei P1 kann ein Fehler auftreten, oder bei P2 kann ein Fehler auftreten, der E1 oder E2 auslöst.
Betrachten Sie die folgenden Fälle:
• Wir erhalten eine erfolgreiche Antwort vom Server in P1, aber die zurückgegebenen Daten sind nicht korrekt oder es sind keine Daten auf dem Server verfügbar (denken Sie an ein leeres Array). In einem solchen Fall sollte für das nächste Versprechen P2 der Fehlerbehandler E2 ausgelöst werden.
• Wir erhalten einen Fehler für das Versprechen P2, der E2 auslöst. Im Handler befinden sich jedoch Daten aus dem Cache, die sicherstellen, dass die Anwendung wie gewohnt geladen werden kann. In diesem Fall möchten wir möglicherweise sicherstellen, dass nach E2 S3 aufgerufen wird.
Jedes Mal, wenn wir einen Erfolgs- oder Fehlerhandler schreiben, müssen wir einen Anruf tätigen. Ist dieses Versprechen angesichts unserer aktuellen Funktion ein Erfolg oder ein Misserfolg für den nächsten Handler in der Versprechenskette?
Wenn wir den Erfolgshandler für das nächste Versprechen in der Kette auslösen möchten, können wir einfach einen Wert aus dem Erfolgs- oder dem Fehlerhandler zurückgeben
Wenn wir andererseits den Fehlerbehandler für das nächste Versprechen in der Kette auslösen möchten, können wir dies mithilfe eines
deferred
Objekts und Aufrufen seinerreject()
Methode tunZurückgestellte Objekte in Jquery: https://api.jquery.com/jquery.deferred/
Zurückgestellte Objekte in AngularJs: https://docs.angularjs.org/api/ng/service/ $ q
quelle
Die Funktion then () bezieht sich auf "Javascript-Versprechen", die in einigen Bibliotheken oder Frameworks wie jQuery oder AngularJS verwendet werden.
Ein Versprechen ist ein Muster für die Behandlung asynchroner Operationen. Mit dem Versprechen können Sie eine Methode namens "then" aufrufen, mit der Sie die Funktion (en) angeben können, die als Rückruf verwendet werden sollen.
Weitere Informationen finden Sie unter: http://wildermuth.com/2013/8/3/JavaScript_Promises
Und für Angular-Versprechen: http://liamkaufman.com/blog/2013/09/09/using-angularjs-promises/
quelle
A promise can only succeed or fail once
, undIf a promise has succeeded or failed and you later add a success/failure callback, the correct callback will be called
promise
und was damit gemacht wirdcallback
Meines Wissens gibt es keine eingebaute
then()
Methodejavascript
(zum Zeitpunkt dieses Schreibens).Es scheint, dass alles, was
doSome("task")
zurückkehrt, eine Methode hat, die aufgerufen wirdthen
.Wenn Sie das Rückgabeergebnis von
doSome()
in der Konsole protokollieren , sollten Sie in der Lage sein, die Eigenschaften der zurückgegebenen Daten anzuzeigen.UPDATE (Stand ECMAScript6) : -
Die
.then()
Funktion wurde in reines Javascript aufgenommen.Aus der Mozilla-Dokumentation hier ,
Das Promise-Objekt ist wiederum definiert als
Das heißt, das
Promise
fungiert als Platzhalter für einen Wert, der noch nicht berechnet wurde, aber in Zukunft aufgelöst werden soll. Die.then()
Funktion wird verwendet, um die Funktionen zuzuordnen, die bei der Lösung des Versprechens aufgerufen werden sollen - entweder als Erfolg oder als Misserfolg.quelle
.then
, aber jetzt kommen native Versprechen in ES6: html5rocks.com/de/tutorials/es6/promisesHier ist eine Sache, die ich mir selbst gemacht habe, um zu klären, wie die Dinge funktionieren. Ich denke, auch andere können dieses konkrete Beispiel nützlich finden:
quelle
Hier ist eine kleine JS_Fiddle.
Dann gibt es einen Methoden-Rückruf-Stack, der verfügbar ist, nachdem ein Versprechen aufgelöst wurde. Er ist Teil einer Bibliothek wie jQuery, aber jetzt ist er in nativem JavaScript verfügbar. Nachfolgend finden Sie eine ausführliche Erläuterung der Funktionsweise
Sie können ein Versprechen in nativem JavaScript ausführen: Genau wie es in jQuery Versprechen gibt, kann jedes Versprechen gestapelt und dann mit Rückrufen zum Auflösen und Ablehnen aufgerufen werden. So können Sie asynchrone Aufrufe verketten.
Ich gabelte und bearbeitete aus MSDN-Dokumenten den Batterieladestatus.
Dadurch wird versucht herauszufinden, ob der Laptop oder das Gerät des Benutzers den Akku auflädt. dann heißt es und du kannst deine Arbeit nach dem Erfolg erledigen.
Ein weiteres es6-Beispiel
quelle
then
kommt und wie es funktioniert. Sie sollten Ihre Antwort verbessern, um diese Details bereitzustellen.Ich vermute, doSome gibt dies zurück, das ist myObj, das auch eine then-Methode hat. Standardmethode Verkettung ...
Wenn doSome dies nicht zurückgibt und das Objekt ist, auf dem doSome ausgeführt wurde, können Sie sicher sein, dass es ein Objekt mit einer then-Methode zurückgibt ...
Wie @patrick betont, gibt es kein then () für Standard-js
quelle
doSome ("task") muss ein Versprechen-Objekt zurückgeben, und dieses Versprechen hat immer eine then-Funktion. Ihr Code ist also genau so
und Sie wissen, dass dies nur ein gewöhnlicher Aufruf der Mitgliedsfunktion ist.
quelle
.then
gibt ein Versprechen in der asynchronen Funktion zurück.Gutes Beispiel wäre:
Um eine weitere Logik hinzuzufügen, können Sie dem
reject('I am the rejected param')
Aufruf auch die Funktion hinzufügen und console.log it.quelle
In diesem Fall
then()
handelt es sich um eine Klassenmethode des vondoSome()
method zurückgegebenen Objekts .quelle
Die Funktion ".then ()" wird häufig für versprochene Objekte in der Asynchoronus-Programmierung für Windows 8 Store-Apps verwendet. Soweit ich verstanden habe, funktioniert es irgendwie wie ein Rückruf.
Details finden Sie in dieser Dokumentation unter http://msdn.microsoft.com/en-us/library/windows/apps/hh700330.aspx
Natürlich kann es auch der Name für eine andere definierte Funktion sein.
quelle
Ein anderes Beispiel:
Dieselbe Logik mit Pfeilfunktionen Kurzform:
quelle
Ich bin ungefähr 8 Jahre zu spät, na ja ... sowieso weiß ich nicht wirklich, was dann () tut, aber vielleicht hat MDN eine Antwort. Eigentlich könnte ich es ein bisschen besser verstehen.
Dies zeigt Ihnen (hoffentlich) alle Informationen, die Sie benötigen. Es sei denn, jemand hat diesen Link bereits gepostet. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
Das Format ist versprechen.prototype.then () Das Versprechen und der Prototyp sind wie Variablen, aber nicht wie Variablen in Javascript. Ich meine, wie andere Dinge wie navigator.getBattery (). Then () dorthin gehen, wo diese tatsächlich existiert, aber ist Dieser wird im Internet kaum verwendet und zeigt Statusinformationen zum Akku des Geräts, weitere Informationen und mehr zu MDN, wenn Sie neugierig sind.
quelle