Comment est une promesse/reporter bibliothèque mises en œuvre?
Comment est une promesse/reporter bibliothèque comme q mis en œuvre? J'étais en train de lire le code source mais il lui est assez difficile à comprendre, alors j'ai pensé que ce serait génial si quelqu'un pouvait m'expliquer, à partir d'un niveau élevé, quelles sont les techniques utilisées pour mettre en œuvre les promesses en mono-thread JS environnements, comme le Node et les navigateurs.
- double possible de Concept - Distillation comment une promesse fonctionne?
Vous devez vous connecter pour publier un commentaire.
Je le trouve plus difficile à expliquer que pour montrer un exemple, voici donc une très simple de mise en œuvre de ce qu'un reporter/promesse pourrait être.
Avertissement: Ce n'est pas une fonctionnelle de la mise en œuvre et de certaines parties de la Promesse/Un cahier des charges sont manquants, C'est juste pour expliquer la base de promesses.
tl;dr: Aller à la Créer des classes et des exemple section pour voir la pleine mise en œuvre.
Promesse:
Nous devons d'abord créer un objet promise à un tableau de rappels. Je vais commencer à travailler avec des objets parce que c'est plus clair:
maintenant ajouter des rappels avec la méthode alors:
Et nous avons besoin de l'erreur rappels trop:
Reporter:
Maintenant créer le reporter de l'objet qui aura une promesse:
Le reporter doit être résolu:
Et les besoins de rejeter:
Noter que les rappels sont appelés dans un délai d'expiration pour permettre que le code sera toujours asynchrone.
Et qu'est ce qu'une base de reporter/promesse de la mise en œuvre des besoins.
Créer des classes et des exemple:
Maintenant permet de convertir à la fois des objets de classes, d'abord la promesse:
Et maintenant, le reporter:
Et voici un exemple d'utilisation:
Comme vous pouvez le voir les pièces de base sont simples et petites. Il grandira quand vous ajoutez d'autres options, par exemple les multiples promesses de résolution:
ou de la promesse de chaînage:
Pour en savoir plus sur le cahier des charges: CommonJS Promesse De Spécification. Notez que les principales bibliothèques (Q, when.js, rsvp.js, nœud-promesse, ...) suivre Promesses/A spécification.
Espère que j'ai été assez clair.
Edit:
Comme demandé dans les commentaires, j'ai ajouté deux choses dans cette version:
Pour être en mesure d'appeler la promesse lorsque résolu, vous devez ajouter le statut de la promesse, et lorsque le puis est appelé à vérifier le statut. Si le statut est résolu ou rejeté exécutez simplement le rappel de ses données ou erreur.
Pour être en mesure à la chaîne des promesses, vous devez générer un nouveau différer pour chaque appel à
then
et, lorsque la promesse est résolu/a rejeté, de résoudre ou de rejeter la nouvelle promesse avec le résultat de la fonction de rappel. Ainsi, lorsque la promesse est faite, si le callback retourne une nouvelle promesse, il est lié à la promesse retourné avec lathen()
. Si non, la promesse est résolu avec le résultat de la fonction de rappel.Ici, c'est la promesse:
Et le reporter:
Comme vous pouvez le voir, il a grandi un peu.
then
retour d'une autre promesse (qui est indispensable).How is a promise/defer library like q implemented
etit'd be great if someone could explain to me, from a high level, what are the techniques used to implement promises
. Pour l'expliquer, j'ai montré le code de manière incrémentielle à se concentrer sur certaines parties sans perdre le contexte. Vous expliquer la spécification et ce qui aurait dû être, et non la manière dont il est mis en place et ensuite vous montre une très petite mise en œuvre qui n'a pas l'air rien de semblable à Q. Et, plus précisément, il demande unpromise/defer
mise en œuvre, et le vôtre se complique pas de reporter.then
fonction ne renvoie rien, non? Si oui, pouvez-vous également nous montrer cethen
doit renvoyer en fait, afin de permettre le chaînage? Ce n'était pas immédiatement clair pour moi.Promise
classe est réellement utilisé?Note: This method is not expected to become standard, and is only implemented by recent builds of Internet Explorer and Node.js 0.10+. It meets resistance both from Gecko (Firefox) and Webkit (Google/Apple).
Q est très complexe de la promesse de la bibliothèque en termes de mise en œuvre, car elle vise à soutenir le pipelining et RPC type de scénarios. J'ai mon propre os à nu de la mise en œuvre de la Promesses/A+ spécification ici.
En principe c'est assez simple. Avant que la promesse est réglé/résolu, vous gardez une trace de tout rappel ou errbacks en les poussant dans un tableau. Lorsque la promesse est réglée, vous appeler les rappels ou errbacks et d'enregistrer ce résultat que la promesse a été réglé avec (et si elle a été accomplie ou rejeté). Après c'est réglé, il vous suffit d'appeler le callback ou errbacks avec les résultats enregistrés.
Qui vous donne environ la sémantique de
done
. Pour construirethen
vous suffit de le retourner une nouvelle promesse qui est résolu avec le résultat de l'appel de l'rappels/errbacks.Si vous êtes intéressé par un plein explenation de la reasonning derrière le développement d'un plein sur la promesse de la mise en œuvre avec le soutien pour le RPC et le pipelining comme Q, vous pouvez lire kriskowal de reasonning ici. C'est vraiment une très belle approche graduée que je ne peux pas le recommander assez fortement, si vous songez à la mise en œuvre de promesses. Il est probablement plus intéressant à lire même si vous êtes simplement à l'aide d'une promesse de la bibliothèque.
Que Forbes mentionne dans sa réponse, j'ai fait la chronique de nombreuses décisions de conception impliqués dans la réalisation d'une bibliothèque comme Q, ici https://github.com/kriskowal/q/tree/v1/design. Qu'il suffise de dire, il y a des niveaux d'une promesse de la bibliothèque, et beaucoup de bibliothèques qui s'arrêtent à différents niveaux.
Au premier niveau, capturé par les Promesses/A+ spécification, une promesse est un proxy pour un résultat final et est adapté pour la gestion de “local asynchronie”. C'est, il convient de s'assurer que le travail se produit dans le bon ordre, et de s'assurer qu'il est simple et directe pour écouter le résultat d'une opération, indépendamment de savoir si elle est déjà réglée, ou va se produire dans l'avenir. Il rend également qu'il est tout aussi simple pour une ou plusieurs parties à s'abonner à un résultat final.
Q, comme je l'ai mis en œuvre, fournit des promesses que les procurations éventuelles, à distance, ou de l'éventuelle+à distance des résultats. À cette fin, il est de conception est inversé, avec différentes implémentations pour des promesses différée, des promesses, des promesses tenues, rejeté des promesses et des promesses pour les objets distants (le dernier étant mis en œuvre dans Q-Connexion). Ils partagent tous la même interface et le travail en envoyant et en recevant des messages comme "alors" (ce qui est suffisant pour des Promesses/A+), mais aussi "get" et "invoquer". Ainsi, Q est sur “distribué asynchronie”, et existe sur un autre calque.
Cependant, Q a été prise vers le bas à partir d'une couche supérieure, où les promesses sont utilisés pour la gestion distribuée de l'asynchronie entre mutuellement suspect parties comme vous, un commerçant, une banque, Facebook, le gouvernement, pas des ennemis, peut-être même des amis, mais parfois avec des conflits d'intérêts. Le Q que j'ai mis en place est conçu pour être API compatible avec une sécurité renforcée des promesses (qui est la raison de la séparation
promise
etresolve
), avec l'espoir qu'il serait de présenter les gens les promesses, les former à l'utilisation de cette API, et de leur permettre de prendre leur code avec eux s'ils ont besoin d'utiliser des promesses dans la sécurité des applications web hybrides dans l'avenir.Bien sûr, il existe des échanges que vous vous déplacez les couches, généralement en vitesse. Donc, les promesses implémentations peuvent également être conçu de manière à co-exister. C'est là que le concept de “thenable” entre. Promesse de bibliothèques au niveau de chaque couche peut être conçu pour consommer promet de n'importe quelle autre couche, de sorte que plusieurs implémentations peuvent coexister, et les utilisateurs peuvent acheter uniquement ce dont ils ont besoin.
Tout cela est dit, il n'y a aucune excuse pour être difficile à lire. Dominique et moi-même travaillons sur une version de Q, qui sera plus modulaire et accessible, avec certains de ses distraire des dépendances et des solutions de rechange déplacés dans d'autres modules et packages. Heureusement que des gens comme Forbes, Crockford, et d'autres ont comblé la lacune de l'éducation en rendant plus simple bibliothèques.
D'abord assurez-vous de comprendre comment les Promesses sont censés travailler. Jetez un oeil à la CommonJs des Promesses propositions et la Promesses/A+ spécifications pour que.
Il y a deux concepts de base qui peuvent être mis en œuvre chaque en quelques lignes simples:
Une Promesse fait de manière asynchrone résolu avec le résultat. L'ajout de rappels est transparente l'action indépendante de celle de savoir si la promesse est déjà résolu ou pas, ils seront appelés avec le résultat une fois qu'il est disponible.
Promesses ont un
then
méthode qui permet le chaînage entre eux. Je prend un callback et retourne une nouvelle Promesse qui sera résolu avec la suite de ce rappel après qu'il a été appelé avec la première promesse de résultat. Si la fonction de rappel renvoie une Promesse, il sera assimilé au lieu de se imbriqués.Autres notions seront entretien d'un erreur de l'état (avec un supplément de rappel pour elle) et d'intercepter les exceptions aux gestionnaires, ou la garantie asynchronity pour les rappels. Une fois que vous ajoutez ceux-ci, vous avez entièrement fonctionnelle d'une Promesse de la mise en œuvre.
Ici est l'erreur de la chose écrite. Malheureusement il est assez répétitif; vous pouvez faire mieux en utilisant les fermetures, mais alors il est vraiment vraiment dur à comprendre.
addCallback
méthode dansPromise
classe sera appelé plus d'une fois? Lethen
méthode retournera une nouvellePromise
exemple, alors pourquoi garder un rappels de tableau dansDeferred
classe?Vous pourriez vouloir vérifier la post de blog sur Adehun.
Adehun est extrêmement léger de mise en œuvre (environ 166 LOC) et très utile pour l'apprentissage de la façon de mettre en œuvre la Promesse/A+ spec.
Avertissement: j'ai écrit le post de blog mais le blog ne s'expliquent tout sur Adehun.
La Transition de la fonction de Gardien de l'État de Transition
Gardien de la fonction; s'assure que les transitions d'état de se produire lorsque toutes les conditions requises sont réunies.
Si les conditions sont remplies, cette fonction met à jour la promesse de l'état et de la valeur. Il déclenche alors la fonction de traitement pour un traitement ultérieur.
Le processus de la fonction effectue le droit d'action fondé sur la transition (par exemple, dans l'attente d'accompli) et est expliquée plus tard.
La fonction
La fonction prend deux arguments optionnels (onFulfill et onReject gestionnaires) et doit retourner une nouvelle promesse. Deux exigences principales:
La base de la promesse (celui qui est alors appelé) a besoin de créer une nouvelle promesse en utilisant le passé dans les gestionnaires; la base stocke également une référence interne à créé cette promesse si elle peut être invoquée une fois que la base se réalise la promesse de/rejeté.
Si la base promesse est réglé (c'est à dire rempli ou rejetée), puis le gestionnaire approprié doit être appelé immédiatement. Adehun.js les poignées de ce scénario par le processus appelant dans la fonction.
`
Le Processus de la fonction de Traitement des Transitions
Ce qui est appelé après que les transitions de l'état ou lorsque la fonction est appelée. Ainsi, il est nécessaire de vérifier pour l'attente des promesses, car il pourrait avoir été appelée à partir de la fonction.
Exécution du processus de la Promesse procédure de Résolution sur tous les internes des promesses (c'est à dire ceux qui étaient attachés à la base de la promesse par le biais de la fonction) et applique les suivantes Promesse/A+ exigences:
Invoquant les gestionnaires de manière asynchrone à l'aide de la Utils.runAsync helper (une fine wrapper autour de setTimeout (setImmediate fonctionnera également)).
La création de secours des gestionnaires pour les onSuccess et onReject gestionnaires s'ils sont absents.
Du choix de la fonction de gestionnaire basé sur la promesse de l'état par exemple remplies ou rejeté.
L'application de la gestionnaire de la base de la promesse de valeur. La valeur de cette opération est transmis à la détermination de la fonction à remplir la promesse du cycle de traitement.
Si une erreur se produit, alors l'attaché promesse est immédiatement rejeté.
fonction process() {
var que = ce,
fulfillFallBack = function(valeur) {
valeur de retour;
},
rejectFallBack = function(la raison) {
jeter de la raison;
};
}
La détermination de la fonction de Résolution des Promesses
C'est probablement la partie la plus importante de la promesse de la mise en œuvre puisqu'elle gère la promesse de résolution. Il accepte deux paramètres: la promesse et sa valeur de résolution.
Alors qu'il y a beaucoup de contrôles pour différentes valeurs de résolution; l'intéressant scénarios de résolution sont deux ceux impliquant une promesse d'être passé et d'un thenable (un objet avec une valeur).
Si la valeur de la résolution est une autre promesse, alors, la promesse doit d'adopter cette résolution de la valeur de l'état. Depuis cette valeur de la résolution peut être en attente ou réglé, la meilleure façon de le faire est de fixer un nouveau gestionnaire de la valeur de la résolution et de la poignée de la promesse d'origine qui y est. Chaque fois qu'il s'installe, puis la promesse d'origine sera résolu ou rejeté.
Le hic ici est que le thenable valeur est alors fonction doit être appelée qu'une seule fois (une bonne utilisation pour la une fois wrapper de la programmation fonctionnelle). De même, si la récupération de la fonction lève une Exception, la promesse est pour être immédiatement rejeté.
Comme avant, alors la fonction est appelée avec des fonctions qui, en définitive, de résoudre ou de rejeter la promesse, mais la différence ici est appelé l'indicateur qui est fixé sur le premier appel et transforme les appels ultérieurs sont pas d'ops.
La Promesse Du Constructeur
Et c'est celui qui met tout cela ensemble. Le remplir et de rejeter les fonctions sont sucre syntaxique qui passent no-op fonctions à résoudre et de les rejeter.
J'espère que cela a aidé à jeter plus de lumière dans la façon dont les promesses de travail.