149 votes

Compréhension des promesses de node.js

De ce que j’ai compris il y a trois façons d’appeler code asynchrone :

  1. Événements : par exemple.``
  2. Rappels : par exemple.``
  3. Promesses

J’ai trouvé une promesse bibliothèque https://github.com/kriszyp/node-promise mais je ne comprends pas.

Quelqu'un pourrait m’expliquer ce que les promesses sont tout au sujet et pourquoi je devrais utiliser ?

Aussi, pourquoi il a été retiré de Node.js ?

98voto

enyo Points 5083

Depuis que cette question a encore de nombreux points de vue (comme le mien), je tenais à préciser que:

  1. nœud-la promesse semble un peu mort pour moi (le dernier commit a environ 1 an) et ne contient presque pas de tests.
  2. Le terme module a l'air très gonflé à moi et c'est assez mal documentée (et je pense que les conventions de nommage sont tout simplement mauvais)
  3. La meilleure voie à suivre semble être le q-cadre qui est à la fois active et bien documenté.

91voto

Paul Robinson Points 3226

Des promesses node.js promis de faire un peu de travail, et d'avoir ensuite séparer les rappels qui seront exécutés pour le succès et l'échec ainsi que de la gestion des délais d'attente. Une autre façon de penser des promesses dans node.js c'est qu'ils étaient des émetteurs qui peut émettre que deux événements: la réussite et l'erreur.

La chose cool à propos de promesses est que vous pouvez les combiner dans la dépendance des chaînes (ne Promets C uniquement lorsque la Promesse d'Un et la Promesse B).

En les enlevant de la base node.js il a créé la possibilité de construire des modules avec différentes implémentations de promesses qui peuvent s'asseoir sur le dessus de la base. Certaines de ces derniers sont de nœud de promesse et de contrats à terme.

20voto

Hrishi Points 1623

Une promesse est une "chose" qui représente le "éventuelle" des résultats d'une opération, pour ainsi dire. Le point à noter ici est que, il effectue l'abstraction des détails de quand quelque chose arrive et vous permet de vous concentrer sur ce qui devrait se produire après qu'il se passe quelque chose. Ce sera résultat en propre, maintenable code où au lieu d'avoir un rappel à l'intérieur d'un rappel à l'intérieur d'un rappel, votre code va ressembler à quelque chose comme:

 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
 });

Les promesses' spec états qu'une promesse de

then

méthode doit retourner une nouvelle promesse qui s'accomplit quand le successHandler ou la failureHandler de rappel est terminé. Cela signifie que vous pouvez à la chaîne promesses lorsque vous avez un ensemble de tâches asynchrones qui doivent être effectuées et être assuré que la séquence des opérations est garantie comme si vous aviez utilisé des rappels. Donc au lieu de passer un rappel à l'intérieur d'un rappel à l'intérieur d'un rappel, le code avec enchaîné promesses ressemble:

var doStuff = new Promise(firstAsyncFunction);
doStuff
  .then(secondAsyncFunction) //returns a promise
  .then(thirdAsyncFunction); //returns a promise

Pour en savoir plus sur les promesses, et pourquoi ils sont super cool, la caisse Dominique du blog : http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/

7voto

Noel Abrahams Points 3678

Mike Taulty a une série de vidéos, chacun d'entre eux à moins de dix minutes de long, décrivant comment la WinJS Promesse de la bibliothèque fonctionne.

Ces vidéos sont très instructives, et Mike parvient à montrer la puissance de la Promesse de l'API avec quelques-uns bien choisis des exemples de code.

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
     });

Le traitement de la façon dont les exceptions sont traitées, est particulièrement bon.

En dépit de la WinJs références, c'est un intérêt général série de vidéos, parce que la Promesse de l'API est assez similaire à travers ses nombreuses implémentations.

RSVP est un léger Promesse de mise en œuvre qui passe à la Promesse/Une+ test de suite. J'aime assez l'API, car il est similaire au style de la WinJS interface.

Mise À Jour Apr-2014

Par ailleurs, la WinJS de la bibliothèque est maintenant open source.

5voto

llambda Points 91

Un autre avantage des promesses est que la gestion des erreurs et exception levée et l’interception est beaucoup mieux que d’essayer de gérer cela avec des rappels.

La bibliothèque de bluebird implémente des promesses et vous donne des traces de la grande pile longue, est très rapide et signale les erreurs non interceptées. C’est la meilleure bibliothèque de promesse disponible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X