Mais quelle utilisation est cette fonctionnalité? Si nous résolvons immédiatement cette promesse, nous pouvons aussi bien écrire du code directement sous l'intérieur de ce Exemple: P> alors () code> gestionnaire d'épanouissement. P>
myPromise.then(function(someV) {
// ...
return v1;
}).then(function(v) {
// some code
3 Réponses :
C'est une question décente. Dans d'autres "constructions monadiques", il existe deux fonctions pour cela (un pour la cartographie et l'autre pour la cartographie pour une promesse), mais parfois en 2013, il a été décidé de ne pas faire la même chose en JavaScript et permet de renvoyer une valeur.
Ceci a du sens pour enchaîner une opération avec des promesses sans em> exécuter une opération ASYNC. Par exemple: P> fetch('./foo').then(x => x.json()).then(JSON.parse);
Le dernier alors code> va analyser l'objet JavaScript qui est déjà analysé par
x.json () code>?
x.json () code> renvoie la chaîne JSON et
json.parse code> analyse de la chaîne? Je suppose que cela a du sens parfois, vous retournerez une certaine valeur et en faites une promesse résolue. Dans votre exemple, pouvez-vous le faire
récupérer ('./ foo'). Ensuite (x => json.parse (x.json ())) code>? Bien que, il retourne toujours une valeur sans autre chaînage
Il existe de nombreux cas de chaînes de promesse où le premier gestionnaire de promesses retourne une valeur bronde mais ne peut pas être facilement fusionné avec le deuxième gestionnaire de promesses de la chaîne:
La promesse intermédiaire est la valeur de retour d'une fonction: p>
Le premier gestionnaire peut également jeter une exception en plus de retourner une valeur, auquel cas le second ne doit pas fonctionner mais plutôt le gestionnaire de rejet: P>
Le premier gestionnaire peut également renvoyer une promesse sur un autre chemin d'exécution, qui doit être attendu par le second gestionnaire: P>
Il y a un gestionnaire de rejet outre le premier gestionnaire, dont le second gestionnaire doit également obtenir: p>
Dans tous ces cas, la fonction alors code> devra faire face à des valeurs claires. Bien sûr, ils auraient toujours pu être enveloppés dans
promess.Resolve (v1) code>, mais il a été décidé de ne pas exiger cela. Il y a aussi une autre raison pour laquelle
alors code> devra faire face aux valeurs primitives: un gestionnaire de vide (par exemple à la fin de la chaîne) renvoie
non défini code> et
puis < / code> devra gérer cela de manière appropriée. p> p>
Je pense que je comprends plus de promesses de donner un aperçu de cette situation: P>
Quel que soit le rendement du gestionnaire d'épanouissement, la valeur primitive, les objets qui ne sont pas des prochaines promesses, alors que la valeur résolue toujours Ceci s'appelle déballer dans la communauté de promesses, je crois. P>
Donc, si vous renvoyez une valeur primitive ou un objet qui n'est pas soumis à: p>
Cette valeur sera utilisée pour résoudre S'il s'agit d'un objet qui est une véritable promesse, ou une vraie promesse: p>
On peut appeler comme suit: p>
Alors la promesse épuisante et réelle peut tous les deux résoudre Dans la communauté de promesses, il semble même s'il s'agit de valeurs primitives ou d'objets qui ne sont pas soumis à une promesse, afin que les opérations futures soient plus cohérentes: opération sur une promesse. p>
Peu importe si vous enveloppez et enveloppez, car cela ne se débrouillera pas et déballera de toute façon. (Lorsque la promesse interne est résolue, elle propage la débordement à l'enveloppe extérieure jusqu'à ce qu'elle ne puisse pas continuer.) P>
On se sent presque comme si les promesses sont des objets de niveau plus élevé que de présent, nous ne travaillerons que avec eux. (Lorsque nous avons affaire à des promesses et à des valeurs ordinaires, tout sera converti en une promesse (en utilisant p code> ou transformé en une promesse de sorte qu'il résout
p code>, où
p code> est ce que
.Chen () code> retourne. p>
p code> ou il sera effectué en
promess.resolve (v) code> qui est immédiatement résolu, et il s'agit de résoudre
P code> immédiatement. P>
obj.then (réswep) code> où
résolvep code> est la fonction qui peut résoudre
p code>. p>.
p code>. p>
promess.Resolve (valeur) code> et traitée). p>
Pouvez-vous s'il vous plaît citer la phrase spécifique où il est indiqué que " la promesse telle que retournée par
() code> sera une promesse résolue i>"? Tout ce que je peux trouver sur cette page MDN des mentions comme " la promesse retournée par
puis code> est résolu i>" (sans qualification temporelle directe). La promesse retournée est toujours en attente.
@Bergi C'est le premier élément de cette liste: "Retourne une valeur, la promesse renvoyée par alors est résolue avec la valeur renvoyée comme valeur."
Je pense que j'ai mal compris votre question. Vous avez demandé de déplacer le code dans le suivant i>
alors code> le gestionnaire, pas sur le déplacement sous dessous (et à l'extérieur) le
puis code> gestionnaire au cas où la promesse est résolu de manière synchrone (ce qu'il n'est jamais).
Il n'y a probablement pas beaucoup de cas où vous écririez du code comme celui-ci, c'est-à-dire que vous devez toujours déplacer "
// du code code>" dans le premier gestionnaire. Mais qu'une chaîne de promesse doit éventuellement retourner une valeur non prometteuse est plutôt évidente, alors je suis un peu perdu où vous êtes perdu ici.