Menu
CoddyTech

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.

challenge icon

Défi

Facile

Cette é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.

  1. Dans store.js, dans load, attends que readFile se termine avant que JSON.parse utilise le texte.
  2. Dans store.js, load est async, donc elle renvoie une promesse. Attends son résultat à l’endroit où le magasin définit notes. Un module peut utiliser await au niveau supérieur, en dehors de toute fonction.
  3. Dans store.js, attends que writeFile se termine dans save, et attends this.save() dans add et dans remove.
  4. Dans notes.js, store.add et store.remove sont maintenant async. Attends leur résultat dans les branches add et done, afin que n et removed contiennent 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;
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Express