Frage

Von dem, was ich verstanden habe gibt es drei Möglichkeiten der asynchronen Code aufrufen:

  1. Veranstaltungen, zum Beispiel request.on("event", callback);
  2. Rückrufe, z.B. fs.open(path, flags, mode, callback);
  3. Promises

fand ich die Knoten-Versprechen Bibliothek aber ich verstehe es nicht.

Könnte jemand erklären, was Versprechungen sind und warum sollte ich es verwenden?

Auch, warum wurde es von Node.js entfernt?

War es hilfreich?

Lösung

Promises in node.js versprach einige Arbeit zu tun und hatte dann getrennte Rückrufe, die sowie Umgang mit Timeouts für Erfolg und Misserfolg ausgeführt würden. Eine weitere Möglichkeit der Versprechungen in node.js zu denken war, dass sie Emittern, die nur zwei Ereignisse emittieren könnte. Erfolg und Fehler

Die kühle Sache über Versprechen ist, dass Sie sie in Abhängigkeitsketten (versprechen C nur, wenn Versprechen A und Versprechen B komplett) kombinieren können.

Durch sie von dem Kern node.js entfernen, erstellt es der Möglichkeit von Modulen mit unterschiedlichen Implementierungen von Versprechungen aufgebaut, die auf der Oberseite des Kerns sitzen kann. Einige davon sind Knoten-Versprechen und Futures .

Andere Tipps

Da diese Frage hat noch viele Ansichten (wie bei mir) Ich wollte darauf hinweisen, dass:

  1. node-Versprechen sehen ziemlich tot zu mir (letzter commit war vor etwa 1 Jahr) und enthält fast keine Tests.
  2. Die Futures Modul sieht für mich sehr aufgebläht und ist schlecht dokumentiert (und ich denke, dass die Namenskonventionen nur schlecht sind)
  3. Der beste Weg zu gehen scheint die q Rahmen zu sein, die sowohl aktive als auch gut dokumentiert ist.

Ein Versprechen ist ein „Ding“, das die „eventual“ Ergebnisse einer Operation darstellt, so zu sprechen. Der Punkt hier zu beachten ist, dass es abstrahiert die Details , wenn etwas passiert, und ermöglicht es Ihnen, sich darauf zu konzentrieren, was passieren sollte nach , dass etwas passiert. Dies wird in einem sauberen, wartbaren Code führt, dass stattdessen einen Rückruf in einem Rückruf in einem Rückruf zu haben, wird Ihr Code aussieht etwas wie:

 var request = new Promise(function(resolve, reject) {
   //do an ajax call here. or a database request or whatever.
   //depending on its results, either call resolve(value) or reject(error)
   //where value is the thing which the operation's successful execution returns and
   //error is the thing which the operation's failure returns.
 });

 request.then(function successHandler(result) {
   //do something with the result
 }, function failureHandler(error) {
  //handle
 });

Die Spezifikation Staaten versprechen, dass ein Versprechen

then

Methode sollte ein neues Versprechen zurück, die erfüllt ist, wenn die gegebenen successHandler oder der failureHandler Rückruf beendet ist. Dies bedeutet, dass Sie kann Kette zusammen Versprechen, wenn Sie haben eine Reihe von asynchronen Aufgaben, die durchgeführt werden müssen, und sicher sein, dass die Sequenzierung von Operationen gewährleistet ist, als ob Sie Rückrufe verwendet hatten. Anstatt also einen Rückruf in einem Rückruf in einem Rückruf vorbei, der Code mit gekettet Versprechen sehen aus wie:

var doStuff = firstAsyncFunction(url) {
                return new Promise(function(resolve, reject) {
                       $.ajax({
                        url: url,
                        success: function(data) {
                            resolve(data);
                        },
                        error: function(err) {
                             reject(err); 
                        } 
                  });
               };
doStuff
  .then(secondAsyncFunction) //returns a promise
  .then(thirdAsyncFunction); //returns a promise

Um mehr über Versprechen und warum sie super cool, Kasse Domenic Blog sind: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/

Das neue Tutorial auf Versprechungen vom Autor PouchDB ist wahrscheinlich das beste, das ich je gesehen habe. Es deckt weise die klassischen Anfängerfehler Sie richtig Nutzungsmuster und sogar ein paar anti-Muster zeigen, dass nach wie vor häufig verwendet werden - auch in anderen Tutorials !!

Genießen Sie!

PS Ich habe nicht ein paar andere Teile dieser Frage beantworten, wie sie haben auch von anderen abgedeckt.

Mike Taulty hat eine Reihe von Videos weniger jeder von ihnen als zehn Minuten lang, das beschreibt, wie die WinJS Versprechen Bibliothek funktioniert.

Diese Videos sehr informativ, und Mike kommt mit ein paar gut gewählte Code-Beispiele die Kraft der Verheißung API zeigen.

var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });

 promise = promise.then(
     function (xhr) {
     },
     function (xhr) {
         // handle error
     });

Die Behandlung von Ausnahmen, wie werden behandelt ist besonders gut.

Trotz der WinJS Referenzen, ist dies ein allgemeines Interesse Video-Serie, weil das Versprechen API über seine vielen Implementierungen im Großen und Ganzen ähnlich ist.

RSVP ist eine leichte Versprechen Implementierung, die das Versprechen passiert / A + Test Suite. Ich mag die API, weil es in der Art der WinJS Schnittstelle ähnlich ist.

Update April 2014

Im Übrigen sind die WinJS Bibliothek ist jetzt Open Source .

Ein weiterer Vorteil verspricht, ist, dass die Fehlerbehandlung und Ausnahme Werfen und Fangen ist viel besser, als zu versuchen, Griff, dass mit Rückrufen.

Die drossel Bibliothek implementiert Versprechungen und geben Ihnen großen langen Stack-Traces, ist sehr schnell, und warnen vor abgefangene Fehler. Es ist auch schneller und benötigt weniger Speicher als die anderen Versprechen Bibliotheken, nach http://bluebirdjs.com/docs /benchmarks.html

Was genau ist ein Versprechen?

Ein Versprechen ist einfach ein Objekt, das das Ergebnis eines Asynchron-Betrieb darstellt. Ein Versprechen kann in einem der folgenden drei Zustände:

anhängig :: Dies ist der Ausgangszustand, bedeutet das Versprechen weder erfüllt noch abgelehnt.

erfüllt :: Dies bedeutet, das Versprechen erfüllt ist, bedeutet, dass der durch Versprechen dargestellte Wert ist bereit, verwendet werden.

abgelehnt :: Das heißt, die Operationen und damit scheiterten nicht das Versprechen erfüllen. Neben den Staaten gibt es drei wichtige Entitäten Versprechen verbunden, die wir wirklich brauchen, zu verstehen,

  1. Executor-Funktion :: Executor-Funktion definiert die Asynchron-Operation, die durchgeführt werden muss und dessen Ergebnis durch das Versprechen vertreten ist. Es beginnt die Ausführung, sobald das Versprechen Objekt initialisiert wird.

  2. resolve :: Entschlossenheit ist ein Parameter an die Executor-Funktion übergeben, und im Fall der Testamentsvollstrecker erfolgreich läuft dann diese lösen das Ergebnis genannt passiert.

  3. ablehnen :: abzulehnen ist ein weiterer Parameter an die Executor-Funktion übergeben, und es wird verwendet, wenn die Executor-Funktion fehlschlägt. Die Fehlerursache kann übergeben werden das ablehnen.

Also, wenn wir ein Versprechen Objekt zu erstellen, haben wir Executor, Resolve zu bieten und Abweisen.

Referenz :: Promises

Ich habe mich auch in Versprechungen in node.js vor kurzem. Bis heute der when.js scheint der Weg zu sein, aufgrund seiner Geschwindigkeit und Ressourcenverbrauch zu gehen, aber die Dokumentation auf q.js hat mir viel besser zu verstehen. So verwenden when.js aber docs die q.js das Thema zu verstehen.

Von der q.js readme auf GitHub:

  

Wenn eine Funktion keinen Wert zurückgeben oder eine Ausnahme auslösen, ohne   blockiert, kann es ein Versprechen stattdessen zurück. Ein Versprechen ist ein Objekt,   repräsentiert den Rückgabewert oder die ausgelöste Ausnahme, dass die Funktion   kann schließlich bieten. Ein Versprechen kann auch als Proxy für ein verwendet werden   Remote-Objekt zu überwinden Latenz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top