Menu
CoddyTech

Promises

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

Les callbacks imbriqués dans d’autres callbacks deviennent difficiles à suivre, et chacun doit penser à vérifier err.

node:fs/promises renvoie plutôt une promesse : un objet qui représente un résultat obtenu plus tard. .then(fn) s’exécute avec le résultat, .catch(fn) s’exécute si une étape précédente a échoué, et .finally(fn) s’exécute dans les deux cas.

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

readFile('poem.txt', 'utf8')
    .then((text) => console.log(text.length + ' characters'))
    .catch(() => console.log('No poem today'))
    .finally(() => console.log('Bye'));

Une erreur lancée à l’intérieur de .then est également transmise à .catch, de sorte qu’un seul gestionnaire couvre la lecture et l’analyse. Une promesse qui échoue sans .catch fait planter le programme.

challenge icon

Défi

Facile

Cette étape ouvre le projet de l’outil en ligne de commande pour les notes fourni avec le cours, plutôt que les fichiers de ton projet de Callbacks (y compris count.js). Ton travail précédent reste dans sa propre leçon. Lis les fichiers fournis avant de modifier count.js. Cette copie contient l’exemple de comptage asynchrone des notes.

  • Réécris count.js en utilisant readFile de node:fs/promises et .then.
  • Un fichier manquant affiche maintenant No notes yet, depuis un .catch.
  • Done s’affiche toujours en dernier, depuis .finally.

Lance node count.js, puis node count.js nothere.json.

Sans argument, la sortie est Reading..., 2 notes, puis Done, chacun sur sa propre ligne. Avec nothere.json, la ligne du milieu est No notes yet.

Essayez vous-même

import fs from 'node:fs';

const file = process.argv[2] ?? 'notes.json';

console.log('Reading...');
fs.readFile(file, 'utf8', (err, text) => {
    if (err) {
        console.log(`Cannot read ${file}`);
    } else {
        console.log(`${JSON.parse(text).length} notes`);
    }
    console.log('Done');
});

Toutes les leçons de Les bases de Node.js

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