0
votes

Quelle est l'utilisation de ES6 Promise alors () Handler de l'épanouissement renvoyant une valeur?

On dit que à l'intérieur un .Chen () code> gestionnaire d'épanouissement, si une valeur v1 code> (un objet non prometteur) est renvoyé, alors la promesse telle que retournée par () code > Sera une promesse résolue, avec la valeur résolue v1 code> .

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 alors () code> gestionnaire d'épanouissement. P>

Exemple: P>

myPromise.then(function(someV) {
  // ...
  return v1;
}).then(function(v) {
  // some code


4 commentaires

Pouvez-vous s'il vous plaît citer la phrase spécifique où il est indiqué que " la promesse telle que retournée par () sera une promesse résolue "? Tout ce que je peux trouver sur cette page MDN des mentions comme " la promesse retournée par puis est résolu " (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 alors le gestionnaire, pas sur le déplacement sous dessous (et à l'extérieur) le puis 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 " 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.


3 Réponses :


1
votes

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);


2 commentaires

Le dernier alors va analyser l'objet JavaScript qui est déjà analysé par x.json () ?


x.json () renvoie la chaîne JSON et json.parse 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 ())) ? Bien que, il retourne toujours une valeur sans autre chaînage



0
votes

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: XXX

  • 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: XXX

  • Le premier gestionnaire peut également renvoyer une promesse sur un autre chemin d'exécution, qui doit être attendu par le second gestionnaire: XXX

  • Il y a un gestionnaire de rejet outre le premier gestionnaire, dont le second gestionnaire doit également obtenir: XXX

    Dans tous ces cas, la fonction alors devra faire face à des valeurs claires. Bien sûr, ils auraient toujours pu être enveloppés dans promess.Resolve (v1) , mais il a été décidé de ne pas exiger cela. Il y a aussi une autre raison pour laquelle alors devra faire face aux valeurs primitives: un gestionnaire de vide (par exemple à la fin de la chaîne) renvoie non défini et puis < / code> devra gérer cela de manière appropriée.


0 commentaires

0
votes

Je pense que je comprends plus de promesses de donner un aperçu de cette situation:

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 p ou transformé en une promesse de sorte qu'il résout p , où p est ce que .Chen () retourne.

Ceci s'appelle déballer dans la communauté de promesses, je crois.

Donc, si vous renvoyez une valeur primitive ou un objet qui n'est pas soumis à:

Cette valeur sera utilisée pour résoudre p ou il sera effectué en promess.resolve (v) qui est immédiatement résolu, et il s'agit de résoudre P immédiatement.

S'il s'agit d'un objet qui est une véritable promesse, ou une vraie promesse:

On peut appeler comme suit:

obj.then (réswep) résolvep est la fonction qui peut résoudre p . .

Alors la promesse épuisante et réelle peut tous les deux résoudre p .

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.

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.)

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 promess.Resolve (valeur) et traitée).


0 commentaires