Menu
CoddyTech

Async et Await

Fait partie de la section Les bases de Node.js du Journey Node.js de Coddy. Leçon 16 sur 24.

Une chaîne d’appels .then se lit différemment de la façon dont tu envisages les étapes : lire, puis analyser, puis enregistrer.

Dans une fonction async, await met en pause jusqu’à ce qu’une promesse soit réglée et te fournit sa valeur. Une promesse rejetée déclenche une exception à cet endroit, que try et catch permettent de gérer. 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
  • store.js lit et écrit désormais avec node:fs/promises. Ajoute les await manquants pour que chaque commande fonctionne comme avant.
  • notes.js attend store.add et store.remove, qui sont désormais async.

Exécute d’abord node notes.js list pour lire l’erreur, puis add et done 1 lorsque tout fonctionne.

Essayez vous-même

import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';

const file = 'notes.json';

// readFile et writeFile renvoient maintenant des promesses. Attendez chacune 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