Promesse de retour de fonction asynchrone : une explication détaillée
En JavaScript, comprendre l'interaction entre les fonctions asynchrones et les promesses est crucial. Les fonctions asynchrones, introduites par JavaScript ES2017, permettent des opérations asynchrones sans avoir besoin de rappels. Ils renvoient une promesse, qui représente le résultat éventuel de l'opération asynchrone.
Considérez la fonction asynchrone suivante :
async function latestTime() { const bl = await web3.eth.getBlock('latest'); console.log(bl.timestamp); // Returns a primitive console.log(typeof bl.timestamp.then == 'function'); // Returns false - not a promise return bl.timestamp; }
La confusion survient lorsque la fonction lastTime n'est pas utilisée dans une autre fonction asynchrone. et est affecté à une variable en dehors du contexte asynchrone :
const time = latestTime(); // Promise { <pending> }
En conséquence, la variable de temps devient une promesse en attente au lieu de la valeur primitive renvoyé par la fonction asynchrone. Cela se produit parce que les fonctions asynchrones renvoient toujours une promesse, même si elles renvoient une valeur primitive dans leur corps.
Pour gérer correctement cette situation, vous avez deux options :
1. Utiliser les promesses directement :
Dans des contextes non asynchrones, tels que les gestionnaires d'événements ou les niveaux supérieurs de modules, les promesses doivent être gérées directement. Vous pouvez utiliser la méthode then() :
latestTime() .then(time => { console.log(time); }) .catch(error => { // Handle/report error });
2. Attente de niveau supérieur dans les modules :
Les environnements JavaScript modernes prennent en charge l'attente de niveau supérieur dans les modules, vous permettant d'écrire :
const time = await latestTime();
Sous le capot :
Pour comprendre comment le moteur JavaScript gère une fonction asynchrone, considérez sa réécriture comme une promesse explicite rappel :
function latestTime() { return new Promise((resolve, reject) => { web3.eth.getBlock('latest') .then(bl => { console.log(bl.timestamp); console.log(typeof bl.timestamp.then == 'function'); resolve(bl.timestamp); }) .catch(reject); }); }
Cette syntaxe de promesse explicite met en évidence plusieurs points importants :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!