Promesses et gestion de l'asynchronicité avec async/await
Les promesses et async/await sont deux concepts clés dans la gestion de l'asynchronicité en JavaScript et Node.js. Ils permettent d'écrire du code asynchrone de manière plus lisible et plus facile à maintenir, comparé à l'ancienne approche basée sur les callbacks.
Promesses
Une promesse est un objet qui représente l'achèvement ou l'échec éventuel d'une opération asynchrone. Elle peut se trouver dans l'un des trois états suivants :
- Pending : état initial, ni accomplie ni rejetée.
- Fulfilled : signifie que l'opération a été accomplie avec succès.
- Rejected : signifie que l'opération a échoué.
Voici un exemple de création et d'utilisation d'une promesse :
let myPromise = new Promise((resolve, reject) => {
// Une opération asynchrone (par exemple, lire un fichier)
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) {
reject(err); // La promesse est rejetée si une erreur survient
} else {
resolve(data); // La promesse est résolue avec les données du fichier
}
});
});
myPromise
.then(data => {
console.log(data); // Traiter les données
})
.catch(error => {
console.error(error); // Gérer l'erreur
});
Async/Await
async/await est une extension des promesses qui simplifie encore plus la syntaxe pour travailler avec des opérations asynchrones, permettant d'écrire du code asynchrone qui ressemble à du code synchrone séquentiel.
- async : Le mot-clé
asyncest utilisé pour déclarer une fonction asynchrone, qui renvoie une promesse. - await : Le mot-clé
awaitest utilisé pour attendre la résolution d'une promesse à l'intérieur d'une fonctionasync. Il ne peut être utilisé qu'à l'intérieur des fonctionsasync.
Voici comment vous pouvez utiliser async/await :
async function readFileAsync() {
try {
let data = await fs.promises.readFile('file.txt', 'utf8');
console.log(data); // Traiter les données
} catch (error) {
console.error(error); // Gérer l'erreur
}
}
readFileAsync();
Avantages de Async/Await
- Clarté : Le code est plus facile à lire et à comprendre.
- Gestion des erreurs : Les erreurs peuvent être capturées avec des blocs
try/catch, ce qui est une approche familière pour de nombreux développeurs. - Débogage : Comme le code ressemble à du code synchrone, il est souvent plus facile à déboguer.
- Maintenabilité : Le code est généralement plus propre et plus facile à maintenir.
Bonnes Pratiques
- Utilisez
async/awaitpour simplifier le code impliquant des promesses. - Attrapez toujours les erreurs avec des blocs
try/catchautour des opérationsawait. - N'utilisez pas
awaitdans des boucles si les opérations peuvent être exécutées en parallèle. À la place, utilisezPromise.allpour attendre plusieurs promesses simultanément. - Évitez d'utiliser
awaitinutilement pour des opérations qui sont déjà synchrones, car cela peut introduire des retards inutiles.
En adoptant les promesses et async/await, vous pouvez écrire un code asynchrone qui est non seulement performant mais aussi plus facile à lire et à maintenir.