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é :
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 :
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
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
.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
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
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
- Toujours gérer les erreurs: Ne les ignorez pas
awaiterreurs qui peuvent être levées ; utiliseztry/catchou.catch()pour gérer - Évitez les await inutiles: Si vous n'avez pas besoin d'attendre le résultat, vous pouvez retourner la Promise directement
- Utilisez le parallélisme à bon escient: Plusieurs opérations asynchrones indépendantes doivent être exécutées en parallèle (utilisez
Promise.all) - Gardez le code clair: Évitez une profondeur excessive
async/awaitd'imbrication ; extrayez des fonctions quand c'est nécessaire - Faites attention à l'impact sur les performances: Chaque
awaitmet 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
const data = await fetchData();
console.log(data);