Question

Quelles sont les différences entre Deferreds, promesses et à terme?
Y at-il une théorie généralement approuvée derrière tous ces trois?

Était-ce utile?

La solution

À la lumière de l'aversion apparente pour la façon dont je l'ai tenté de répondre à la question de l'OP. La réponse littérale est, une promesse est quelque chose partagée w / autres objets, tandis qu'un différé doit être maintenu privé. En premier lieu, un versement différé (qui étend généralement Promise) peut se résoudre, alors qu'une promesse pourrait ne pas être en mesure de le faire.

Si vous êtes intéressé par les menus détails, puis examinez promesses / A + .


Pour autant que je sache, l'objectif général est d'améliorer la clarté et le couplage desserrez à travers une interface standardisée. Voir de SuggeStionS de lecture @ jfriend00:

Au lieu de passer directement à callbacks fonctions, ce qui peut conduire à des interfaces étroitement couplées, en utilisant des promesses permet une à préoccupations distinctes pour le code qui est synchrone ou asynchrone.

Personnellement, j'ai trouvé différé particulièrement utile pour traiter par exemple modèles qui sont remplis par des demandes asynchrones, des scripts de chargement qui ont des réseaux de dépendances, et la rétroaction de l'utilisateur à des données de formulaire d'une manière non-bloquant.

En effet, comparer la forme pure de rappel de faire quelque chose après le chargement CodeMirror en mode JS de manière asynchrone (Désolé, je ne l'ai pas utilisé jQuery dans un en ):

/* 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.");
   };
});

Pour la promesse formulée la version (encore une fois, des 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 code semi-pseudo, mais je l'espère fait l'idée de base un peu clair. Au fond, en retournant une promesse standardisée, vous pouvez passer la promesse autour, ce qui permet de grouper plus clair.

Autres conseils

Ces réponses, y compris la réponse choisie, sont bons pour l'introduction de promesses sur le plan conceptuel, mais manque de détails de ce exactement les différences sont la terminologie qui se pose lors de l'utilisation des bibliothèques les mettre en œuvre (et il sont des différences importantes).

Comme il est encore un processus évolutif spec , la réponse vient actuellement de tenter de sonder les références (comme wikipedia ) et mises en œuvre (comme jQuery ):

  • différés : Jamais décrit dans les références populaires, 1 2 3 4 mais couramment utilisé par les mises en œuvre comme l'arbitre de la résolution de la promesse (la mise en œuvre de resolve et reject). 5 6 7

    Parfois deferreds sont également promesses (mise en œuvre then), 5 6 d'autres fois il est considéré comme plus pur d'avoir différé seulement capable de la résolution, et forcer l'utilisateur à accéder à la promesse de en utilisant then. 7

  • Promesse :. La plupart des tout-encompasing mot pour la stratégie en discussion

    Un objet proxy stocker le résultat d'une fonction cible dont synchronicité nous voudrions abstraite, plus d'exposer une fonction then accepter une autre fonction cible et retourner une nouvelle promesse. 2

    Exemple de CommonJS :

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

    Toujours décrits dans les références populaires, bien que jamais précisé à dont la résolution de responsabilité incombe. 1 2 3 4

    Toujours présent dans les implémentations populaires, et n'a jamais donné résolution abilites. 5 6 7

  • Future : un terme qui semble dépréciée trouvé dans quelques références populaires 1 et au moins une mise en œuvre populaire, 8 mais apparemment être éliminé de la discussion, de préférence pour le terme 'promettre' 3 et pas toujours mentionné dans l'intro populaireductions au sujet. 9

    Cependant, au moins une bibliothèque utilise le terme générique pour abstraire la manipulation synchronicité et d'erreurs, tout en ne fournissant pas la fonctionnalité then. 10 On ne sait pas si en évitant le terme « promesse » était intentionnelle, mais probablement bon choix car les promesses sont construites autour de « thenables ». 2

Références

  1. Wikipedia sur Promises & Futures
  2. promesses / A + spec
  3. DOM standard sur Promises
  4. DOM standard Promises Spec WIP
  5. Toolkit DOJO Deferreds
  6. jQuery Deferreds
  7. Q
  8. FutureJS
  9. section fonctionnelle Javascript est désactivé sur Promises
  10. Futures AngularJS Test d'intégration

Divers pouvant prêter à confusion choses

Ce qui a vraiment fait tout clic pour moi était cette présentation par Domenic Denicola.

Dans un github essentiel , il a donné la description je aime le plus, il est très concis:

Le point de promesses est de nous rendre la composition fonctionnelle et l'erreur bouillonnante dans le monde async.

En d'autres termes, les promesses sont une manière qui nous permet d'écrire asynchrone code qui est presque aussi facile d'écrire comme si elle était synchrone .

Considérez 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 en train d'écrire 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 cela reste compliqué, regarder cette présentation!)

En ce qui concerne Différé, il est un moyen de promesses de .resolve() ou .reject(). Dans le Promesses / B spécifications, il est appelé .defer(). Dans jQuery, il est $.Deferred().

S'il vous plaît noter que, pour autant que je sache, la mise en œuvre Promesse en jQuery est cassé (voir que GIST), au moins de jQuery 1.8.2.
Il met en œuvre soi-disant promesses / A thenables , mais vous ne recevez pas le traitement d'erreur correct vous devriez, en ce sens que toute la fonctionnalité « async try / catch » ne fonctionnera pas. Ce qui est dommage, parce qu'ayant un « try / catch » avec le code est async refroidir complètement.

Si vous allez promesses d'utilisation (vous devriez les essayer avec votre propre code!), Utilisez Kris Kowal de Q . La version jQuery est juste une aggrégateur de rappel pour l'écriture de code jQuery plus propre, mais manque le point.

En ce qui concerne l'avenir, je ne sais pas, je ne l'ai pas vu que, dans une API.

Modifier talk youtube sur les promesses de Domenic Denicola de de @Farm 'commentaire ci-dessous.

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

Je veux que vous brûler cette phrase dans votre esprit: Une promesse est une valeur asynchrone .

Ceci est une excellente description: une promesse est comme une variable de l'avenir - une référence de première classe à quelque chose qui, à un moment donné, existeront (ou arriver)

.

Promesse représente un proxy pour une valeur connue pas nécessairement lorsque la promesse est créée. Il vous permet d'associer les gestionnaires à une valeur éventuelle de l'action asynchrone succès ou l'échec raison. Cela permet des méthodes asynchrones renvoient des valeurs comme les méthodes synchrones:. Au lieu de la valeur finale, la méthode asynchrone retourne une promesse d'avoir une valeur à un moment donné dans l'avenir

https://developer.mozilla.org/ en-US / docs / Web / JavaScript / référence / Global_Objects / Promise

La méthode de deferred.promise() permet une fonction asynchrone pour empêcher un autre code d'interférer avec la progression ou de l'état de sa demande interne. La promesse n'expose que les méthodes différées nécessaires pour associer des gestionnaires supplémentaires ou déterminer l'état ( puis, fait, échouer, toujours, tuyaux, le progrès, l'État et promesse ), mais pas ceux qui modifient l'état (< strong> résolution, rejeter, informer, resolveWith, rejectWith et notifyWith ).

Si la cible est fournie, deferred.promise() joindra les méthodes sur elle puis retourner cet objet plutôt que de créer un nouveau. Cela peut être utile pour fixer le comportement promesse d'un objet qui existe déjà.

Si vous créez un Différé, conserver une référence à l'impôt différé afin qu'il puisse être résolu ou rejeté à un moment donné. Retourner seulement l'objet Promise via deferred.promise () pour un autre code peut enregistrer des rappels ou inspecter l'état actuel.

Il suffit que nous pouvons dire que Promesse représente une valeur qui ne sait pas encore où comme différé représente le travail non encore terminé.


 entrer image description ici

  • Un promise représente une valeur qui n'est pas encore connue
  • Un deferred représente un travail qui n'a 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.

Référence

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top