Menu
CoddyTech

Temporizadores

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 27 de 33.

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 é executado uma vez. Um programa só termina quando não há mais nenhum temporizador, então um intervalo que você nunca interrompe 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

Um lembrete faz uma contagem regressiva na tela antes de mostrar a nota. Adicione um comando remind que faça isso com um temporizador.

  1. Em notes.js, adicione um comando remind. A palavra depois dele é o número de uma nota, verificado da mesma forma que em done, então você pode reutilizar noteNumber.
  2. Inicie um setInterval com um intervalo de 200 milissegundos. A cada repetição, ele exibe uma linha: primeiro 3, depois 2, depois 1 e, por fim, o texto da nota.
  3. Depois de exibir a nota, pare o intervalo com clearInterval, para que o programa termine.

Com as notas Buy milk e Call Ada, node notes.js remind 2 exibe estas linhas, uma a cada 200 milissegundos:

3
2
1
Call Ada
  1. Um número que não corresponde a uma nota causa uma falha da mesma forma que em done. Com duas notas, node notes.js remind 9 exibe No note 9 em stderr e termina com o código 1, sem fazer a contagem regressiva.

Experimente: digite remind 1 na caixa depois de $ node notes.js e pressione Enter. Você verá a contagem regressiva e, em seguida, sua primeira nota. Depois, digite remind 9: você verá No note 9 em vermelho e o código de saída 1. Se você esquecer clearInterval, o programa nunca termina sozinho, e o terminal o interrompe depois de 5 segundos.

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

Pratique por conta própria: Playground de Express