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à?
Réponses
Trop de publicités?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
etreject
). 5 6 7Parfois 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 dethen
. 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
then
fonction d'accepter une autre cible de la fonction et renvoie une nouvelle promesse. 2Exemple 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
then
fonctionnalité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
- Wikipédia sur les Promesses Et contrats à Terme
- Promesses/A+ caractéristiques
- DOM Standard sur des Promesses
- DOM Standard Promesses Spec WIP
- DOJO Toolkit Deferreds
- jQuery Deferreds
- Q
- FutureJS
- Fonctionnelle de la section Javascript sur des Promesses
- Les contrats à terme en AngularJS des Tests d'Intégration
Divers susceptibles de prêter à confusion choses
-
Différence entre les Promesses/A et les Promesses/A+
(TL;DR, des Promesses/Un+ pour la plupart résout les ambiguïtés dans les Promesses de/Un)
À 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.
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).
"-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
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