Comment obtenir la valeur de la promesse ?
P粉116631591
P粉116631591 2023-08-21 13:47:33
0
2
460
<p>Je regardais la documentation Angular pour des exemples de <code>$q</code>, mais j'ai pensé que cela pourrait fonctionner pour les promesses en général. L'exemple ci-dessous est copié directement de leur documentation, y compris leurs commentaires : </p> <pre class="brush:php;toolbar:false;">promiseB = promiseA.then(function(result) { renvoyer le résultat + 1 ; }); // Lorsque promiseA est résolue, promiseB sera résolue immédiatement et sa valeur sera le résultat de promiseA plus 1</pre> <p>Je ne sais pas comment cela fonctionne. Si je pouvais appeler <code>.then()</code> sur le résultat du premier <code>.then()</code>, en les enchaînant ensemble, je sais que je pourrais le faire, alors < ;code>promiseB</code> est un objet de promesse de type <code>Object</code>. Il ne s'agit pas d'un <code>Numéro</code>. Alors, que veulent-ils dire par « sa valeur sera le résultat de la promesse A plus 1 » ? </p> <p>Dois-je y accéder comme <code>promiseB.value</code> ? Comment un rappel réussi peut-il renvoyer une promesse et renvoyer « résultat + 1 » ? Il me manque quelque chose. </p>
P粉116631591
P粉116631591

répondre à tous(2)
P粉616111038

Lorsqu'une promesse est résolue/rejetée, elle appelle son gestionnaire de réussite/erreur :

var promiseB = promiseA.then(function(result) {
   // 用result做一些事情
});
La méthode

then renvoie également une promesse : promiseB qui sera résolue/rejetée en fonction de la valeur de retour du gestionnaire de succès/erreur de promiseA.

Le gestionnaire de réussite/erreur de

promiseA peut renvoyer trois valeurs possibles qui affecteront le résultat de promiseB :

  1. Ne renvoie aucune valeur → promiseB se résout immédiatement et undefined est transmis au gestionnaire de réussite de promiseB
  2. Renvoie une valeur → promiseB se résout immédiatement et la valeur est transmise au gestionnaire de réussite de promiseB
  3. Renvoyer une promesse → Lorsque la promesse est résolue, la promesseB se résoudra. Lorsque la promesse est rejetée, la promesseB sera rejetée. La valeur transmise au gestionnaire de promiseB sera alors le résultat de promise

Avec cette compréhension, vous pouvez comprendre ce qui suit :

promiseB = promiseA.then(function(result) {
  return result + 1;
});

Ensuite, l'appel renvoie immédiatement la promesseB.

Lorsque promiseA est résolue, elle transmet le résultat au gestionnaire de réussite de promiseA.

Puisque la valeur de retour est le résultat de promiseA + 1 et que le gestionnaire de succès renvoie une valeur (option 2 ci-dessus), promiseB sera résolue immédiatement et le gestionnaire de succès de promiseB recevra le résultat de promiseA + 1.

P粉155128211

La valeur renvoyée dans la fonction de réussite de

promiseAthen函数返回一个新的promise(promiseB),在promiseA解决后立即解决,其值是在promiseA.

Dans ce cas, promiseA解决为一个值-result,然后立即使用result + 1的值解决promiseB.

Accédez aux résultats de promiseB的值与访问promiseA de la même manière.

promiseB.then(function(result) {
    // 这里你可以使用promiseB的结果
});

À partir de ECMAScript 2016 (ES7, 2016), async/awaitdevient le standard en JavaScript, ce qui permet une syntaxe alternative à l'approche ci-dessus. Maintenant vous pouvez écrire comme ceci :

let result = await functionThatReturnsPromiseA();
result = result + 1;

Il n'y a pas de promesseB maintenant car nous avons déroulé le résultat de la promesseA en utilisant awaitet vous pouvez l'utiliser directement.

Cependant, await只能在async ne peut être utilisé que dans une fonction async. Donc en zoomant un peu, le code ci-dessus doit être contenu dans une fonction :

async function doSomething() {
    let result = await functionThatReturnsPromiseA();
    return result + 1;
}

Pour être clair, dans cet exemple doSomething函数的返回值仍然是一个promise,因为async函数返回的是promise。所以如果你想要访问返回值,你需要使用result = await doSomething(), cela ne peut être utilisé que dans une autre fonction asynchrone. Fondamentalement, dans le contexte asynchrone parent, vous avez un accès direct aux valeurs produites par le contexte asynchrone enfant.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal