Menu
CoddyTech

Temporizadores

Parte de la sección Conceptos básicos de Node.js del Journey de Node.js de Coddy. Lección 27 de 33.

Un recordatorio debe hacer la cuenta regresiva en pantalla, paso a paso, y después detenerse.

setInterval(fn, ms) ejecuta fn cada ms milisegundos hasta que clearInterval(id) lo detiene; setTimeout se ejecuta una vez. Un programa termina solo cuando no queda ningún temporizador, así que un intervalo que nunca borras hace que siga ejecutándose.

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

El terminal detiene un programa después de 5 segundos, así es como te das cuenta de que olvidaste un clearInterval.

challenge icon

Desafío

Fácil

Un recordatorio muestra una cuenta regresiva en pantalla antes de mostrar la nota. Agrega un comando remind que haga esto con un temporizador.

  1. En notes.js, agrega un comando remind. La palabra que viene después es un número de nota, que se verifica de la misma manera que en done, así que puedes reutilizar noteNumber.
  2. Inicia un setInterval con un retraso de 200 milisegundos. En cada intervalo, imprime una línea: primero 3, después 2, después 1 y, por último, el texto de la nota.
  3. Después de imprimir la nota, detén el intervalo con clearInterval para que el programa termine.

Con las notas Buy milk y Call Ada, node notes.js remind 2 imprime estas líneas, una cada 200 milisegundos:

3
2
1
Call Ada
  1. Si el número no corresponde a una nota, se produce un error igual que en done. Si hay dos notas, node notes.js remind 9 imprime No note 9 en stderr y termina con el código 1, sin iniciar la cuenta regresiva.

Pruébalo: escribe remind 1 en el cuadro después de $ node notes.js y presiona Intro. Verás la cuenta regresiva y, después, tu primera nota. Luego escribe remind 9: verás No note 9 en rojo y el código de salida 1. Si olvidas clearInterval, el programa no termina por sí solo y el terminal lo detiene después de 5 segundos.

Pruébalo tú mismo

// Tu herramienta de notas empieza aquí.
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 las lecciones de Conceptos básicos de Node.js

Practica por tu cuenta: Playground de Express