Async et await
Fait partie de la section Les bases de Node.js du Journey Node.js de Coddy. Leçon 23 sur 33.
Une chaîne d’appels .then ne suit pas la façon dont tu envisages les étapes : lire, puis analyser, puis enregistrer.
Dans une fonction async, await met l’exécution en pause jusqu’à ce qu’une promesse soit résolue ou rejetée et te donne sa valeur. Une promesse rejetée déclenche une exception à cet endroit ; try et catch la gèrent donc. Dans un module, await fonctionne aussi au niveau supérieur.
import { readFile } from 'node:fs/promises';
const loadConfig = async () => {
try {
return JSON.parse(await readFile('config.json', 'utf8'));
} catch {
return {};
}
};
const config = await loadConfig();
console.log(config.port ?? 3000);Une fonction async renvoie toujours une promesse, donc son appelant doit lui aussi utiliser await. Si tu oublies un await, tu obtiens la promesse elle-même, Promise { <pending> }, au lieu de sa valeur.
Défi
FacileCette étape ouvre le projet préparé de l’outil en ligne de commande de gestion de notes du cours, plutôt que les fichiers de ton projet de Promises (y compris count.js). Ton travail précédent reste dans sa propre leçon. Lis les fichiers fournis avant de modifier store.js. Cette copie contient le lecteur de notes basé sur les promesses et sa gestion des erreurs.
store.js utilise maintenant les versions basées sur les promesses de readFile et writeFile, et ses méthodes sont async. Mais rien n’attend encore la résolution des promesses, donc chaque commande échoue. Ajoute await partout où une promesse doit se terminer avant l’étape suivante.
- Dans
store.js, dansload, attends quereadFilese termine avant queJSON.parseutilise le texte. - Dans
store.js,loadestasync, donc elle renvoie une promesse. Attends son résultat à l’endroit où le magasin définitnotes. Un module peut utiliserawaitau niveau supérieur, en dehors de toute fonction. - Dans
store.js, attends quewriteFilese termine danssave, et attendsthis.save()dansaddet dansremove. - Dans
notes.js,store.addetstore.removesont maintenantasync. Attends leur résultat dans les branchesaddetdone, afin quenetremovedcontiennent des valeurs, et non des promesses.
Cela fait sept await en tout. Chaque commande fonctionne alors comme avant. list affiche les notes de notes.json. Avec les deux notes de départ, add Buy bread affiche Saved note 3., puis done 1 affiche Done: Buy milk.
Essaie : saisis list dans la zone après $ node notes.js avant de modifier quoi que ce soit. Tu vois notes.json is damaged: ..., mais le fichier est intact : JSON.parse a reçu une promesse au lieu du texte du fichier. Après tes modifications, list affiche de nouveau les notes. Saisis ensuite add Buy bread et vérifie que tu vois Saved note 3.. Saisis done 1 et vérifie que tu vois Done: Buy milk.
Essayez vous-même
import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';
const file = 'notes.json';
// readFile et writeFile renvoient désormais des promesses. Attendez chacune d’elles avec await.
const load = async () => {
if (!existsSync(file)) {
return [];
}
try {
return JSON.parse(readFile(file, 'utf8'));
} catch (err) {
console.error(`notes.json is damaged: ${err.message}`);
process.exit(1);
}
};
const store = {
notes: load(),
async save() {
writeFile(file, JSON.stringify(this.notes, null, 2));
},
async add(text) {
this.notes.push(text);
this.save();
return this.notes.length;
},
async remove(n) {
const [text] = this.notes.splice(n - 1, 1);
this.save();
return text;
},
};
export default store;
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Les bases de Node.js
1Exécuter JavaScript avec Node
Bonjour, NodeLire la commandeArguments de ligne de commandeCommandes5Événements, entrées et packages
Écouter avant d’émettreÉmetteurs d’événementsLire les entréesEntraînez-vous par vous-même : Playground Express