Menu
CoddyTech

Timers

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 19 de 24.

Um lembrete deve fazer uma contagem regressiva na tela, uma etapa de cada vez, e depois parar.

setInterval(fn, ms) executa fn a cada ms milissegundos até que clearInterval(id) o interrompa; setTimeout executa uma vez. Um programa só termina quando não há mais nenhum temporizador ativo, então um intervalo que você nunca limpa mantém o programa em execução.

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

O terminal interrompe um programa após 5 segundos, e é assim que você percebe que se esqueceu de usar clearInterval.

challenge icon

Desafio

Fácil
  • remind <n> exibe 3, 2, 1 e, em seguida, o texto da nota n, uma linha a cada 200 ms, e o programa termina.
  • Um número inválido responde como done: No note <word> e código de saída 1.

Execute node notes.js remind 1 e, em seguida, node notes.js remind 9.

Experimente você mesmo

// Sua ferramenta de anotações começa aqui.
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);
}

Todas as lições de Fundamentos de Node.js