المؤقتات
جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 19 من 24.
ينبغي أن يعدّ التذكير التنازلي على الشاشة، خطوةً واحدة في كل مرة، ثم يتوقف.
تشغّل setInterval(fn, ms) الدالة fn كل ms ميلي ثانية حتى توقفها clearInterval(id)؛ أما setTimeout فتشغّلها مرة واحدة. لا ينتهي البرنامج إلا عند عدم بقاء أي مؤقّت، لذا فإن فترةً زمنيةً لا توقفها تُبقيه قيد التشغيل.
let lap = 1;
const id = setInterval(() => {
console.log(`Lap ${lap}`);
lap += 1;
if (lap > 3) {
clearInterval(id);
}
}, 500);توقف الوحدة الطرفية البرنامج بعد 5 ثوانٍ، وهذه هي الطريقة التي تلاحظ بها نسيان clearInterval.
التحدي
سهل- يطبع
remind <n>الأرقام3و2و1، ثم نص الملاحظة n، سطرًا كل 200 ms، وينتهي البرنامج. - يُظهر الرقم غير الصالح استجابةً مثل
done:No note <word>، ورمز خروج 1.
شغّل node notes.js remind 1، ثم node notes.js remind 9.
جرّب بنفسك
// تبدأ أداة ملاحظاتك هنا.
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);
}