Heim  >  Artikel  >  Web-Frontend  >  Ausführliche Erklärung der Verwendung von Promise in JavaScript mit Beispielen_Grundkenntnisse

Ausführliche Erklärung der Verwendung von Promise in JavaScript mit Beispielen_Grundkenntnisse

WBOY
WBOYOriginal
2016-05-16 15:53:011126Durchsuche

Auszug – Parse JavaScript SDK bietet jetzt einen jquery-kompatiblen Promises-Modus, der die meisten asynchronen Methoden unterstützt. Was das bedeutet, werden Sie verstehen, nachdem Sie das Folgende gelesen haben.

„Versprechen“ stellen das nächste große Paradigma in der JavaScript-Programmierung dar, aber zu verstehen, warum sie so großartig sind, ist nicht einfach. Der Kern besteht darin, dass ein Versprechen ein Aufgabenergebnis darstellt, das möglicherweise erfüllt wird oder nicht. Die einzige für den Promise-Modus erforderliche Schnittstelle ist der Aufruf der then-Methode, mit der eine Rückruffunktion registriert werden kann, die aufgerufen wird, wenn das Versprechen abgeschlossen ist oder fehlschlägt. Dies wird im Allgemeinen in CommonJS Promises/A-Vorschlag. Ich möchte beispielsweise ein Prase.Object-Objekt speichern. Dies ist eine asynchrone Operation. Im alten Callback-Paradigma könnte Ihr Code so geschrieben sein:

object.save({ key: value }, {
 success:function(object) {
  // the object was saved.
 },
 error:function(object, error) {
  // saving the object failed.
 }
});
在新的Promise范式中,同样的代码你可以这样写:
 
object.save({ key: value }).then(
 function(object) {
  // the object was saved.
 },
 function(error) {
  // saving the object failed.
 });
Kein großer Unterschied? Was ist also die große Sache? Nun, die wahre Stärke von Versprechen liegt in der Verkettung von Vielfachen. Wenn Promise.then(func) aufgerufen wird, wird ein neues Versprechen zurückgegeben, das erst ausgeführt wird, wenn das vorherige abgeschlossen ist. Hier gibt es jedoch einen Sonderfall: Wenn mein Rückruf bis dahin ein neues Versprechen zurückgibt, wird das bis dahin zurückgegebene Versprechen erst dann ausgeführt, wenn die Rückrufausführung abgeschlossen ist. Weitere Informationen finden Sie unter Versprechen/A. Dies ist eine komplexe Regel. Wir können sie anhand von Beispielen besser verstehen.

Angenommen, Sie schreiben einen Anmeldecode, der nach einem Objekt sucht und es dann aktualisiert. Im alten Callback-Paradigma könnten Sie die Pyramidencode-Vervollständigung verwenden:


Parse.User.logIn("user","pass", {
 success:function(user) {
  query.find({
   success:function(results) {
    results[0].save({ key: value }, {
     success:function(result) {
      // the object was saved.
     }
    });
   }
  });
 }
});
Das sieht schon lächerlich aus, aber was noch lächerlicher ist, ist, dass es nicht einmal eine Fehlerbehandlung gibt. Aber die Promise-Chain-Struktur lässt den Code komfortabler aussehen:



Parse.User.logIn("user","pass").then(function(user) {
 returnquery.find();
}).then(function(results) {
 returnresults[0].save({ key: value });
}).then(function(result) {
 // the object was saved.
});
Wow! So viele!


Fehlerbehandlung

Der obige Code fügte keine Fehlerbehandlung hinzu, als er einfach war, aber nachdem Sie ihn hinzugefügt haben, werden Sie feststellen, dass es im alten Rückrufcode ein Durcheinander ist:



Parse.User.logIn("user","pass", {
 success:function(user) {
  query.find({
   success:function(results) {
    results[0].save({ key: value }, {
     success:function(result) {
      // the object was saved.
     },
     error:function(result, error) {
      // An error occurred.
     }
    });
   },
   error:function(error) {
    // An error occurred.
   }
  });
 },
 error:function(user, error) {
  // An error occurred.
 }
});
Da Versprechen wissen, ob die Verarbeitung abgeschlossen ist, können Fehler weitergegeben werden, ohne dass ein Rückruf ausgeführt wird, bis ein Fehler auftritt. Der obige Code kann beispielsweise wie folgt abgekürzt werden:



Parse.User.logIn("user","pass").then(function(user) {
 returnquery.find();
}).then(function(results) {
 returnresults[0].save({ key: value });
}).then(function(result) {
 // the object was saved.
},function(error) {
 // there was some error.
});
Normalerweise denken Entwickler, dass ein Fehler bei einem asynchronen Versprechen gleichbedeutend mit dem Auslösen einer Ausnahme ist. Wenn ein Rückruf einen Fehler auslöst, gibt das Versprechen tatsächlich eine Fehlermeldung zurück. Die Übergabe des Fehlers an den nächsten verfügbaren Fehlerhandler entspricht dem Auslösen einer Ausnahme, bis sie abgefangen wird.


jQuery, Backbone und Parse

Es gibt viele Bibliotheken, die Versprechen zur Verwendung durch Entwickler implementieren. Wie Deferred von jQuery, WinJS.Promise von Microsoft, when.js, q und dojo.Deferred.

Es gibt jedoch etwas Interessantes zu wissen. Sie können die lange und faszinierende jQuery-Pull-Request-Diskussion hier lesen. Die Implementierung von jQuery folgt an vielen Stellen nicht vollständig den Regeln. Wenn ein Fehlerbehandler andere Informationen als nur die Rückgabe eines Versprechens zurückgibt, erwägen die meisten Implementierungen die Behandlung des Fehlers, ohne ihn weiterzugeben. Jquery denkt jedoch nicht daran, diesen Fehler hier zu behandeln, sondern gibt ihn stattdessen weiter. Obwohl Versprechen aus verschiedenen Systemen nahtlos ineinander übergehen sollten, sollten Sie dennoch vorsichtig sein. Ein mögliches Problem besteht darin, dass Versprechen im Fehlerbehandler zurückgegeben werden (und die ursprünglichen Werte ersetzen), da sie gleich behandelt werden.



doFailingAsync().then(function() {
 // doFailingAsync doesn't succeed.
},function(error) {
 // Try to handle the error.
 return"It's all good.";
}).then(function(result) {
 // Non-jQuery implementations will reach this with result === "It's all good.".
},function(error) {
 // jQuery will reach this with error === "It's all good.".
});

In der neuesten Version von Backbone 0.9.10 geben asynchrone Methoden jetzt ein jqXHR zurück, eine Art jQuery-Versprechen. Eines der Ziele des Parse JavaScript SDK ist es, so weit wie möglich mit Backbone kompatibel zu sein. Wir können kein jqXHR zurückgeben, da es nicht gut mit
Cloud Code funktioniert Fügen Sie eine Parse.Promise-Klasse hinzu. Sie folgt dem jQuery Deferred-Standard. JavaScript SDK analysierenIn der neuesten Version wurden alle asynchronen Methoden aktualisiert, um diese neuen Objekte zu unterstützen, und die alten Rückrufmethoden sind weiterhin verfügbar. Aufgrund der oben aufgeführten Beispiele glaube ich jedoch, dass Sie den neuen Weg bevorzugen. Also versuchen Sie es mit Versprechen!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn