Maison > interface Web > js tutoriel > Pourquoi les fonctions JavaScript asynchrones renvoient-elles toujours des promesses, même lorsqu'elles renvoient des valeurs primitives ?

Pourquoi les fonctions JavaScript asynchrones renvoient-elles toujours des promesses, même lorsqu'elles renvoient des valeurs primitives ?

Mary-Kate Olsen
Libérer: 2024-12-18 15:05:13
original
579 Les gens l'ont consulté

Why Do Async JavaScript Functions Always Return Promises, Even When Returning Primitive Values?

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;
}
Copier après la connexion

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> }
Copier après la connexion

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
  });
Copier après la connexion

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();
Copier après la connexion

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);
  });
}
Copier après la connexion

Cette syntaxe de promesse explicite met en évidence plusieurs points importants :

  • La fonction d'exécution de la promesse (transmise à la nouvelle promesse) s'exécute de manière synchrone, c'est pourquoi web3.eth.getBlock est appelé immédiatement.
  • Les erreurs générées dans l'exécuteur de la promesse ou ses rappels sont détectées et se propagent sous forme de promesse refus.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal