Menu
CoddyTech

Minuteries

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

Un rappel doit effectuer un compte à rebours à l’écran, une étape à la fois, puis s’arrêter.

setInterval(fn, ms) exécute fn toutes les ms millisecondes jusqu’à ce que clearInterval(id) l’arrête ; setTimeout s’exécute une seule fois. Un programme se termine uniquement lorsqu’il ne reste aucune minuterie, donc un intervalle que tu n’arrêtes jamais le maintient en cours d’exécution.

let lap = 1;
const id = setInterval(() => {
    console.log(`Lap ${lap}`);
    lap += 1;
    if (lap > 3) {
        clearInterval(id);
    }
}, 500);

Le terminal arrête un programme au bout de 5 secondes, ce qui te permet de repérer un appel à clearInterval oublié.

challenge icon

Défi

Facile

Un rappel effectue un compte à rebours à l’écran avant d’afficher la note. Ajoute une commande remind qui fait cela avec un minuteur.

  1. Dans notes.js, ajoute une commande remind. Le mot qui la suit est un numéro de note, vérifié de la même façon que dans done : tu peux donc réutiliser noteNumber.
  2. Démarre un seul setInterval avec un délai de 200 millisecondes. À chaque déclenchement, affiche une ligne : d’abord 3, puis 2, puis 1, puis le texte de la note.
  3. Après avoir affiché la note, arrête l’intervalle avec clearInterval, afin que le programme se termine.

Avec les notes Buy milk et Call Ada, node notes.js remind 2 affiche ces lignes, à raison d’une toutes les 200 millisecondes :

3
2
1
Call Ada
  1. Un numéro qui ne correspond pas à une note échoue comme dans done. Avec deux notes, node notes.js remind 9 affiche No note 9 sur stderr et se termine avec le code 1, sans effectuer de compte à rebours.

Essaie : saisis remind 1 dans la zone après $ node notes.js, puis appuie sur Entrée. Tu vois le compte à rebours, puis ta première note. Saisis ensuite remind 9 : tu vois No note 9 en rouge et le code de sortie 1. Si tu oublies clearInterval, le programme ne se termine jamais de lui-même, et le terminal l’arrête au bout de 5 secondes.

Essayez vous-même

// Votre outil de prise de notes commence ici.
import { rmSync } from 'node:fs';
import path from 'node:path';
import { formatNote } from './format.js';
import stats from './legacy/stats.cjs';
import store from './store.js';

const [command, ...words] = process.argv.slice(2);
const text = words.join(' ');

const noteNumber = (word) => {
    const n = Number(word);
    if (!Number.isInteger(n) || n < 1 || n > store.notes.length) {
        console.error(`No note ${word}`);
        process.exit(1);
    }
    return n;
};

if (command === 'add') {
    const n = await store.add(text);
    console.log(`Saved note ${n}.`);
} else if (command === 'list') {
    const owner = process.env.NOTES_OWNER ?? 'you';
    console.log(`Notes for ${owner}`);
    if (store.notes.length === 0) {
        console.log('No notes yet');
    }
    const lines = store.notes.map((note, i) => formatNote(i + 1, note));
    if (store.settings.sort === 'newest') {
        lines.reverse();
    }
    lines.forEach((line) => console.log(line));
} else if (command === 'where') {
    const file = path.join(process.cwd(), 'notes.json');
    console.log(file);
    console.log(path.basename(file));
} else if (command === 'stats') {
    console.log(`${store.notes.length} notes, ${stats.countWords(store.notes)} words`);
} else if (command === 'done') {
    const removed = await store.remove(noteNumber(words[0]));
    console.log(`Done: ${removed}`);
} else if (command === 'clear') {
    rmSync('notes.json', { force: true });
    console.log('Deleted notes.json');
} else {
    if (command) {
        console.error(`Unknown command: ${command}`);
    }
    console.error('Usage: node notes.js <command> [words]');
    process.exit(1);
}

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

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