La création d'un (ES6) promesse sans commencer à le résoudre
À l'aide de ES6 promesses, comment puis-je créer une promesse sans la définition de la logique pour le résoudre? Voici un exemple de base (certains caractères d'imprimerie):
var promises = {};
function waitFor(key: string): Promise<any> {
if (key in promises) {
return promises[key];
}
var promise = new Promise(resolve => {
//But I don't want to try resolving anything here :(
});
promises[key] = promise;
return promise;
}
function resolveWith(key: string, value: any): void {
promises[key].resolve(value); //Not valid :(
}
C'est facile à faire avec les autres promesse de bibliothèques. JQuery par exemple:
var deferreds = {};
function waitFor(key: string): Promise<any> {
if (key in promises) {
return deferreds[key].promise();
}
var def = $.Deferred();
deferreds[key] = def;
return def.promise();
}
function resolveWith(key: string, value: any): void {
deferreds[key].resolve(value);
}
Le seul moyen que je vois pour ce faire serait de stocker les résoudre fonction quelque part dans la promesse de l'exécuteur testamentaire, mais qui semble sale, et je ne suis pas sûr qu'il est défini exactement quand cette fonction est exécutée - est-il toujours exécuter immédiatement sur l'industrie de la construction?
Grâce.
- WTH voulez-vous faire quelque chose comme ça? Une promesse sans résoudre la logique est toujours en attente de la promesse.
- Votre deuxième partie de la question est un double de la JavaScript Est la Promesse de Rappel exécuté Asynchronosuly
- Imaginez quelque chose comme un asynchrones dépendance du système d'injection. Vous avez une partie où vous êtes à l'enregistrement de l'injection d'articles, et d'autres où vous êtes en fait la demande. Si je demande à un élément qui n'a pas encore été enregistrée, alors je vais vouloir le retour d'une promesse qui va résoudre le problème une fois il dispose.
- Voir aussi la possible double des Promesses des promesses qui ne sont pas encore créés sans l'aide de l'différé [anti]motif
Vous devez vous connecter pour publier un commentaire.
Bonne question!
La résolution adoptée à la promesse du constructeur intentionnellement fonctionne synchrone afin de soutenir ce cas d'utilisation:
Puis, à un moment plus tard dans le temps:
La raison de la promesse constructeur, c'est que:
Parfois, il ne rentre pas et pour qu'il le solveur fonctionne de manière synchrone. Voici liées à la lecture sur le sujet.
Promise.resolve
et le stockage lié àthen
. Mais, cela a l'air propre et je ne suis même pas sûr si la limitethen
fonctionne.then
s ne fonctionnerait pas si vous n'avez pas à appliquer votre proprethen
fonction.new Promise
à une variable (var p
) nécessaire?var p = new Promise
, la promesse commence son exécution. On dirait que vous êtes la synchronisation de leur résolution (fin de l'exécution) de ne pas le début de l'exécution.Je veux ajouter mes 2 cents ici. Considérant exactement la question "la Création d'un es6 Promesse, sans commencer à le résoudre" je l'ai résolu de la création d'une fonction wrapper et l'appel de la fonction wrapper à la place. Code:
Disons que nous avons une fonction
f
qui renvoie une PromesseMaintenant, je veux préparer un appel à
f('hello', 42)
sans vraiment le résoudre:Espère que cela va aider quelqu'un 🙂
Référencement
Promise.all()
comme demandé dans les commentaires (et a répondu par @Joe Frambach), si je veux préparer un appel àf1('super')
&f2('rainbow')
, 2 fonctions qui retournent des promessesPromise.all()
?Comment sur une approche plus globale?
Vous pourriez écrire un Constructeur qui renvoie une nouvelle Promesse décorées avec
.resolve()
et.reject()
méthodes.Vous serait probablement choisir de nommer le constructeur
Deferred
- terme avec beaucoup de préséance dans [l'histoire de] javascript promesses.En retournant décoré de la promsie plutôt qu'un simple objet, toutes les promesses naturel de méthodes/propriétés restent disponibles en plus à la décoration.
Aussi, par la manipulation
fn
, révèle le motif reste disponible, si vous avez besoin d'/choisissez de l'utiliser sur un Différés.DÉMO
Maintenant, avec la
Deferred()
utilitaire en place, votre code est quasiment identique à celle de jQuery exemple.Deferred
un rappel paramètre, il devrait être rappelé à l'différé b) test de lavalue
/reason
pourundefined
est absolument inutile c).resolve
et.reject
jamais besoin d'être enchaînés d) votre.promise
méthode ne retourne pas une promesse nonfn(promise)
(ou plutôt,fn(deferred)
en fait) au lieu defn(resolve, reject)
. Oui, je peux certainement voir un besoin de "resolver " objets" qui peuvent être stockées quelque part et exposer.fulfill
et.reject
méthodes, mais je pense que ceux qui ne devrait pas mettre en œuvre la promesse de l'interface.new Promise(fn)
de révéler justeresolve
etreject
.when.js
documentation décourage l'utilisation de seswhen.defer
, il ne reconnaissez quein certain (rare) scenarios it can be convenient to have access to both the promise and it's associated resolving functions
. Si cette affirmation est vrai, alors ce que je propose ci-dessus doit être raisonnable (dans de rares scénarios).resolve
etreject
fonction de callback. Si vous voulez vraiment faire les deux deferreds et un rappel, s'il vous plaît au moins, ne pas mélanger les approches, et de suivre de jQuery exemple de passer le report de la fermeture de la portée..promise()
méthode, la solution n'est plus mal, mais je ne pense qu'il n'est pas utile. Il va à l'encontre de mon idée subjective de bonnes pratiques..promise()
méthode déjà.promises
variable déclarée? Ce qu'il détient?