312 votes

Quelles sont les différences entre Différé, de Promesse et d'Avenir en Javascript?

Quelles sont les différences entre Deferreds, des Promesses et des contrats à Terme? Est-il généralement approuvé la théorie derrière ces trois-là?

147voto

woahdae Points 1973

La réponse à ces questions, y compris la réponse choisie, sont bons pour l'introduction de promesses sur le plan conceptuel, mais pas dans les détails de ce qu'est exactement les différences sont dans la terminologie qui se pose lors de l'utilisation de bibliothèques de les mettre en œuvre (et il y en sont importantes différences).

Puisque c'est toujours une évolution de la spec, la réponse vient d'essayer de faire enquête sur les deux références (comme wikipédia) et les mises en œuvre (comme jQuery):

  • Différé: Jamais décrite dans les ouvrages de référence, 1 2 3 4 mais couramment utilisé par les implémentations de l'arbitre de la promesse de résolution (mise en place d' resolve et reject). 5 6 7

    Parfois deferreds sont aussi des promesses (mise en place d' then), 5 6 d'autres fois, il est considéré comme le plus pur d'avoir le Reportés uniquement capable de résolution, et de forcer l'utilisateur à accéder à la promesse de à l'aide de then. 7

  • La promesse: La plupart des tout-encompasing mot de la stratégie en cours de discussion.

    Un objet proxy stocker le résultat d'une fonction dont la cible la synchronicité nous aimerions résumé, en plus d'exposer une thenfonction d'accepter une autre cible de la fonction et renvoie une nouvelle promesse. 2

    Exemple de CommonJS:

    > asyncComputeTheAnswerToEverything()
        .then(addTwo)
        .then(printResult);
    44
    

     

    Toujours décrite dans les ouvrages de référence, bien que jamais précisé à qui a la responsabilité de la résolution des chutes. 1 2 3 4

    Toujours présent dans les implémentations, et ne jamais la résolution des capacités. 5 6 7

  • Avenir: apparemment obsolète terme trouvé dans certains ouvrages de référence 1 et au moins un populaire mise en œuvre, 8 mais, apparemment, être progressivement de la discussion de la préférence pour le terme "promesse" 3 et pas toujours mentionné dans les introductions sur le sujet. 9

    Cependant, au moins une bibliothèque utilise le terme générique pour l'abstraction la synchronicité et la gestion d'erreur, en ne fournissant pas de thenfonctionnalités. 10 Il est difficile de savoir si d'éviter le terme "promesse" était intentionnel, mais c'est probablement un bon choix puisque les promesses sont construit autour de " thenables.' 2

Références

  1. Wikipédia sur les Promesses Et contrats à Terme
  2. Promesses/A+ caractéristiques
  3. DOM Standard sur des Promesses
  4. DOM Standard Promesses Spec WIP
  5. DOJO Toolkit Deferreds
  6. jQuery Deferreds
  7. Q
  8. FutureJS
  9. Fonctionnelle de la section Javascript sur des Promesses
  10. Les contrats à terme en AngularJS des Tests d'Intégration

Divers susceptibles de prêter à confusion choses

100voto

fncomp Points 3194

À la lumière de l'apparente aversion pour la façon dont j'ai tenté de répondre à l'OP de la question. Le littéral réponse est, une promesse est quelque chose de partagé w/ autres objets, tandis qu'un différé doit être maintenu privé. Tout d'abord, un différés (qui s'étend en général Promesse) peut résoudre lui-même, tandis qu'une promesse pourrait ne pas être en mesure de le faire.

Si vous êtes intéressé par les détails, puis examiner les Promesses/A+.


Pour autant que je suis conscient, l'objectif général est d'améliorer la clarté et desserrer le couplage par le biais d'une interface normalisée. Voir la bibliographie à partir de @jfriend00:

Plutôt que de passer des rappels à des fonctions, quelque chose qui peut conduire à étroitement couplé interfaces, à l'aide de promesses permet de préoccupations distinctes pour le code qui est synchrone ou asynchrone.

Personnellement, j'ai trouvé différés particulièrement utiles lorsqu'il s'agit par exemple des modèles qui êtes peuplée par des requêtes asynchrones, le chargement des scripts qui ont des réseaux de dépendances, et de fournir de la rétroaction des utilisateurs de données de formulaire dans un non-bloquant.

En effet, comparer la pure rappel de quelque chose après le chargement CodeMirror en JS mode asynchrone (toutes mes excuses, je n'ai pas utilisé jQuery dans un tout):

/* assume getScript has signature like: function (path, callback, context) 
   and listens to onload && onreadystatechange */
$(function () {
   getScript('path/to/CodeMirror', getJSMode);

   // onreadystate is not reliable for callback args.
   function getJSMode() {
       getScript('path/to/CodeMirror/mode/javascript/javascript.js', 
           ourAwesomeScript);
   };

   function ourAwesomeScript() {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   };
});

Les promesses formulées version (encore une fois, toutes mes excuses, je ne suis pas à jour sur jQuery):

/* Assume getScript returns a promise object */
$(function () {
   $.when(
       getScript('path/to/CodeMirror'),
       getScript('path/to/CodeMirror/mode/javascript/javascript.js')
   ).then(function () {
       console.log("CodeMirror is awesome, but I'm too impatient.");
   });
});

Toutes mes excuses pour le semi-pseudo code, mais j'espère qu'il fait l'idée de base assez clair. Fondamentalement, en retournant une standarized vous le promets, vous pouvez passer à la promesse autour, permettant ainsi plus clair de regroupement.

73voto

Camilo Martin Points 5586

Ce qui a vraiment fait tout cela cliquez sur pour moi était cette présentation par Dominique Denicola.

Dans un github gist, il a donné la description que j'aime le plus, c'est très concis:

Le point de promesses pour nous redonner fonctionnelle de la composition et de l'erreur qui bouillonne dans la async monde.

En d'autres mots, les promesses sont un moyen qui nous permet d'écrire asynchrone code qui est presque aussi facile d'écrire comme si c'était synchrone.

Considérons cet exemple, avec des promesses:

getTweetsFor("domenic") // promise-returning async function
    .then(function (tweets) {
        var shortUrls = parseTweetsForUrls(tweets);
        var mostRecentShortUrl = shortUrls[0];
        return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
    })
    .then(doHttpRequest) // promise-returning async function
    .then(
        function (responseBody) {
            console.log("Most recent link text:", responseBody);
        },
        function (error) {
            console.error("Error with the twitterverse:", error);
        }
    );

Il fonctionne comme si vous étiez à la rédaction de ce code synchrone:

try {
    var tweets = getTweetsFor("domenic"); // blocking
    var shortUrls = parseTweetsForUrls(tweets);
    var mostRecentShortUrl = shortUrls[0];
    var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
    console.log("Most recent link text:", responseBody);
} catch (error) {
    console.error("Error with the twitterverse: ", error);
}

(Si c'est toujours compliqué, regarder qui de présentation!)

Concernant Différé, c'est une façon de .resolve() ou .reject() promesses. Dans les Promesses/B spec, il est appelé .defer(). En jQuery, c'est $.Deferred().

Veuillez noter que, autant que je sache, la Promesse de la mise en œuvre de jQuery est cassé (voir qui gist), à moins que de jQuery 1.8.2.
Il est censé met en œuvre des Promesses/A thenables, mais vous n'obtenez pas la bonne gestion des erreurs, vous devez, dans le sens que l'ensemble "async try/catch" fonctionnalité ne fonctionne pas. Ce qui est dommage, parce que d'avoir un "try/catch" avec async code est tout à fait cool.

Si vous allez utiliser des Promesses (vous devriez essayer avec votre propre code!), utilisation Kris Kowal Q. La version jQuery est juste une partie de rappel agrégateur pour l'écriture de nettoyeur de jQuery, mais manque le point.

Concernant l'Avenir, je n'ai aucune idée, je n'ai pas vu que, dans tous les API.

Edit: Dominique Denicola youtube de parler sur des Promesses de @Ferme'commentaire ci-dessous.

Une citation de Michael Jackson (oui, Michael Jackson) à partir de la vidéo:

Je veux que vous gravez cette phrase dans votre esprit: Une promesse est un asynchrone valeur.

C'est une excellente description: une promesse est comme une variable de l'avenir - une première classe de référence à quelque chose qui, à un certain point, existent (ou produire).

23voto

mattLummus Points 11

"-une promesse représente une valeur qui n'est pas encore connu -un différé représente le travail qui n'est pas encore fini

Une promesse est un espace réservé pour un résultat qui est initialement inconnu alors qu'un différé représente le calcul que les résultats de la valeur."

http://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt1-theory-and-semantics

9voto

Rajat Points 4937

Quelles sont les différences entre Deferreds, des Promesses et des contrats à Terme?

Autant que je sache, ils sont fondamentalement la même chose lorsqu'il est parlé dans le contexte de JavaScript. La littérature peut présenter de légères nuances, mais, fondamentalement, ils sont les mêmes.

Est-il généralement approuvé la théorie derrière ces trois-là?

Si vous êtes à essayer de comprendre ce qu'est la théorie derrière ce modèle, j'ai mes pensées, en voici un résumé: des Promesses en JavaScript

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