Je regarde cet exemple de la documentation d'Angular pour $q
mais je pense que cela s'applique probablement aux promesses en général. L'exemple ci-dessous est copié textuellement de leurs documents avec leur commentaire inclus:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
Je ne sais pas comment cela fonctionne. Si je peux invoquer .then()
le résultat du premier .then()
, les enchaîner, ce que je sais que je peux, alors promiseB
est un objet promesse, de type Object
. Ce n'est pas un Number
. Alors qu'entendent-ils par "sa valeur sera le résultat de promiseA incrémentée de 1"?
Suis-je censé y accéder comme promiseB.value
ou quelque chose comme ça? Comment le rappel de succès peut-il retourner une promesse ET retourner "résultat + 1"? Il me manque quelque chose.
javascript
angularjs
promise
angular-promise
nom_utilisateur_temporaire
la source
la source
Réponses:
promiseA
Lathen
fonction de retourne une nouvelle promesse (promiseB
) qui est immédiatement résolue après lapromiseA
résolution, sa valeur est la valeur de ce qui est retourné par la fonction de succès à l'intérieurpromiseA
.Dans ce cas
promiseA
est résolu avec une valeur -result
puis résout immédiatementpromiseB
avec la valeur deresult + 1
.L'accès à la valeur de
promiseB
se fait de la même manière que nous avons accédé au résultat depromiseA
.Edit décembre 2019 :
async
/await
est désormais standard dans JS, ce qui permet une syntaxe alternative à l'approche décrite ci-dessus. Vous pouvez maintenant écrire:Maintenant, il n'y a pas de promiseB, car nous avons déballé le résultat de promiseA using
await
, et vous pouvez travailler avec lui directement.Cependant,
await
ne peut être utilisé qu'à l'intérieur d'uneasync
fonction. Donc, pour faire un léger zoom arrière, ce qui précède devrait être contenu comme suit:la source
Lorsqu'une promesse est résolue / rejetée, elle appellera son gestionnaire de succès / erreurs:
La
then
méthode renvoie également une promesse: promiseB, qui sera résolue / rejetée en fonction de la valeur de retour du gestionnaire de succès / erreurs de promiseA .Il y a trois valeurs possibles que les gestionnaires de succès / erreurs de promiseA peuvent renvoyer et qui affecteront le résultat de promiseB:
Armé de cette compréhension, vous pouvez comprendre ce qui suit:
L'appel then renvoie immédiatement promiseB. Lorsque promiseA est résolue, il transmet le résultat au gestionnaire de succès de promiseA. Comme la valeur de retour est le résultat de promiseA + 1, le gestionnaire de succès renvoie une valeur (option 2 ci-dessus), donc promiseB se résoudra immédiatement et le gestionnaire de succès de promiseB recevra le résultat de promiseA + 1.
la source
.then
La fonction de promiseB reçoit ce qui est renvoyé par la.then
fonction de promiseA.ici promiseA renvoie est un nombre, qui sera disponible comme
number
paramètre dans la fonction de succès de promiseB. qui sera ensuite incrémenté de 1la source
L'analyse du commentaire un peu différemment de votre compréhension actuelle peut aider:
Cela indique que
promiseB
c'est une promesse mais qui sera résolue immédiatement après lapromiseA
résolution. Une autre façon de voir cela signifie quepromiseA.then()
renvoie une promesse qui est assignéepromiseB
.Cela signifie que la valeur
promiseA
résolue est la valeur quipromiseB
recevra comme valeur successCallback:la source
La réponse pixelbits est correcte et vous devez toujours l'utiliser
.then()
pour accéder à la valeur d'une promesse dans le code de production.Cependant, il existe un moyen d'accéder à la valeur de la promesse directement après sa résolution à l'aide de la liaison node.js interne non prise en charge suivante:
AVERTISSEMENT: process.binding n'a jamais été conçu pour être utilisé en dehors du noyau de nodejs et l'équipe principale de nodejs cherche activement à le déprécier
https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064
la source
Cet exemple je trouve explicite. Remarquez comment wait attend le résultat et vous manquez donc la promesse retournée.
la source
la source
Vous pouvez facilement le faire en utilisant une méthode d'attente asynchrone en javascript.
Vous trouverez ci-dessous un exemple de récupération d'une valeur de promesse WebRTC à l'aide d'un délai d'expiration.
la source
Dans le Node REPL, pour obtenir une connexion à la base de données qui était la valeur d'une promesse, j'ai adopté l'approche suivante:
La ligne avec
await
renverrait normalement une promesse. Ce code peut être collé dans le Node REPL ou s'il y est enregistré,index.js
il peut être exécuté dans Bash avecqui vous laisse dans le Node REPL après avoir exécuté le script avec accès à la variable set. Pour confirmer le retour de la fonction asynchrone, vous pouvez
connection
par exemple vous connecter , puis vous êtes prêt à utiliser la variable. Bien sûr, on ne voudrait pas compter sur la résolution de la fonction asynchrone pour tout code du script en dehors de la fonction asynchrone.la source
Il y a quelques bonnes réponses ci-dessus et voici la version de la fonction ES6 Arrow
la source
J'apprends lentement les promesses javascript, par défaut toutes les fonctions async renvoient une promesse, vous pouvez envelopper votre résultat comme:
" L'expression d'attente entraîne la suspension de l'exécution de la fonction asynchrone jusqu'à ce qu'une promesse soit réglée (c'est-à-dire remplie ou rejetée) et la reprise de l'exécution de la fonction asynchrone après son exécution. Lorsqu'elle est reprise, la valeur de l'expression d'attente est celle de la promesse remplie. . Si la promesse est rejetée, l'expression d'attente renvoie la valeur rejetée . "
En savoir plus sur les attentes et les promesses dans MDN Web Docs
la source
Peut-être que ce petit exemple de code Typescript vous aidera.
Ici, les
repository.get(id)
retours aPromise<Account>
. Je l'affecte à la variableaccount
dans l'then
instruction.la source