Menu
CoddyTech

Timer

Fa parte della sezione Fondamenti di Node.js del percorso Node.js di Coddy. Lezione 27 di 33.

Un promemoria dovrebbe fare il conto alla rovescia sullo schermo, un passaggio alla volta, e poi fermarsi.

setInterval(fn, ms) esegue fn ogni ms millisecondi finché clearInterval(id) non lo ferma; setTimeout viene eseguita una sola volta. Un programma termina solo quando non rimane alcun timer, quindi un intervallo che non cancelli mai continua a mantenerlo in esecuzione.

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

Il terminale interrompe un programma dopo 5 secondi: è così che ti accorgi di aver dimenticato clearInterval.

challenge icon

Sfida

Facile

Un promemoria esegue un conto alla rovescia sullo schermo prima di mostrare la nota. Aggiungi un comando remind che faccia questo con un timer.

  1. In notes.js, aggiungi un comando remind. La parola che lo segue è il numero di una nota, verificato come in done, quindi puoi riutilizzare noteNumber.
  2. Avvia un setInterval con un ritardo di 200 millisecondi. A ogni intervallo stampa una riga: prima 3, poi 2, poi 1, infine il testo della nota.
  3. Dopo aver stampato la nota, interrompi l’intervallo con clearInterval, così il programma termina.

Con le note Buy milk e Call Ada, node notes.js remind 2 stampa queste righe, una ogni 200 millisecondi:

3
2
1
Call Ada
  1. Un numero che non corrisponde a una nota genera un errore come in done. Con due note, node notes.js remind 9 stampa No note 9 su stderr e termina con il codice 1, senza eseguire il conto alla rovescia.

Prova: digita remind 1 nella casella dopo $ node notes.js e premi Invio. Vedrai il conto alla rovescia, poi la tua prima nota. Poi digita remind 9: vedrai No note 9 in rosso e il codice di uscita 1. Se dimentichi clearInterval, il programma non termina mai da solo e il terminale lo interrompe dopo 5 secondi.

Provalo tu

// Il tuo strumento per gli appunti inizia qui.
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);
}

Tutte le lezioni di Fondamenti di Node.js

Esercitati da solo: Playground Express