Node.js async/await

Dans Node.js,async/awaitest un sucre syntaxique pour la gestion des opérations asynchrones.

async/awaitIl est basé sur Promise, mais fait ressembler le code asynchrone à du code synchrone, ce qui améliore grandement la lisibilité et la maintenabilité du code.

asyncLe mot-clé est utilisé pour déclarer une fonction comme asynchrone, etawaitmot-clé est utilisé pour attendre qu'une Promise soit résolue ou rejetée.

Utilisationasync/awaitpeut éviter l'enfer des callbacks et rendre la gestion des erreurs plus intuitive.

JavaScript est monothread. Lorsqu'il rencontre des tâches asynchrones (comme setTimeout ou des requêtes réseau), il les transmet à l'API du navigateur et, une fois terminées, place le callback dans la file de messages.

La boucle d'événements vérifie constamment si la pile d'appels est vide. Si c'est le cas, elle prend un callback dans la file et le pousse sur la pile d'appels pour exécution. Cela évite de bloquer le thread principal tout en traitant les résultats asynchrones dans l'ordre.


Syntaxe de base

fonctions async

Toute fonction peut être rendue asynchrone en ajoutant leasyncmot-clé :

async function myFunction() {
  return "Hello World";
}

asyncUne fonction async renvoie toujours une Promise. Si la valeur de retour n'est pas une Promise, elle est automatiquement enveloppée dans une Promise.

expressions await

awaitne peuvent être utilisées queasyncà l'intérieur d'une fonction async. Cela met en pause l'exécution de la fonction, attend que la Promise soit résolue, puis reprend l'exécution et retourne le résultat :

async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  return data;
}

Gestion des erreurs

approche try/catch

Gestionasync/awaitLa façon la plus courante de gérer les erreurs est d'utilisertry/catch:

Exemple

async function getUser() {
  try {
    const response = await fetch('https://api.example.com/user');
    const user = await response.json();
    return user;
  } catch (error) {
    console.error('Erreur lors de la récupération de l'utilisateur :', error);
    throw error; // Éventuellement relancer l'erreur
  }
}

Gestion directe des Promises

Vous pouvez également gérer directement la Promise retournée :

Exemple

getUser()
  .then(user => console.log(user))
  .catch(error => console.error(error));

Exemples pratiques

Exécution de plusieurs opérations asynchrones en parallèle

UtiliserPromise.allwithasync/awaitpour exécuter plusieurs opérations asynchrones en parallèle :

Exemple

async function fetchMultipleUrls(urls) {
  try {
    const requests = urls.map(url => fetch(url));
    const responses = await Promise.all(requests);
    const data = await Promise.all(responses.map(r => r.json()));
    return data;
  } catch (error) {
    console.error('Erreur lors de la récupération des données:', error);
    throw error;
  }
}

Exemple d'opération de base de données

Exemple

async function getUserAndPosts(userId) {
  try {
    const user = await User.findById(userId);
    const posts = await Post.find({ userId });
    return { user, posts };
  } catch (error) {
    console.error('Erreur de base de données :', error);
    throw error;
  }
}

Bonnes pratiques

  1. Toujours gérer les erreurs: Ne les ignorez pasawaiterreurs qui peuvent être levées ; utiliseztry/catchou.catch()pour gérer
  2. Évitez les await inutiles: Si vous n'avez pas besoin d'attendre le résultat, vous pouvez retourner la Promise directement
  3. Utilisez le parallélisme à bon escient: Plusieurs opérations asynchrones indépendantes doivent être exécutées en parallèle (utilisezPromise.all)
  4. Gardez le code clair: Évitez une profondeur excessiveasync/awaitd'imbrication ; extrayez des fonctions quand c'est nécessaire
  5. Faites attention à l'impact sur les performances: Chaqueawaitmet en pause l'exécution de la fonction ; faites particulièrement attention dans les boucles

Questions courantes

La relation entre async/await et Promise

async/awaitest du sucre syntaxique construit au-dessus de Promise. Touteasyncrenvoie une Promise, et toutawaitpeut être suivi d'une Promise.

Pourquoi ma fonction async renvoie-t-elle undefined ?

Cela peut être parce que vous avez oublié d'utiliserawaitbeforereturn, ou la fonction se termine avant que la Promise ne se résolve.

Puis-je utiliser await au niveau supérieur ?

Dans les modules ES (fichiers se terminant par.mjsoupackage.jsonMoyenne"type": "module"), vous pouvez utiliserawaitdirectement au niveau supérieur. Dans les modules CommonJS, vous devez l'envelopper dans uneasyncfonction.

Exemple

// Dans les modules ES
const data = await fetchData();
console.log(data);
Autres extensions