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.
Desafío
FácilUn recordatorio muestra una cuenta regresiva en pantalla antes de mostrar la nota. Agrega un comando remind que haga esto con un temporizador.
- En
notes.js, agrega un comandoremind. La palabra que viene después es un número de nota, que se verifica de la misma manera que endone, así que puedes reutilizarnoteNumber. - Inicia un
setIntervalcon un retraso de 200 milisegundos. En cada intervalo, imprime una línea: primero3, después2, después1y, por último, el texto de la nota. - Después de imprimir la nota, detén el intervalo con
clearIntervalpara 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- 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 9imprimeNo note 9en 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