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
Mary-Kate Olsenoriginal
2024-12-18 15:05:13590parcourir

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

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 :

  • 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!

Déclaration:
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