المؤقتات
جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 27 من 33.
ينبغي أن يعدّ التذكير التنازلي على الشاشة، خطوةً واحدةً في كل مرة، ثم يتوقف.
تشغّل 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 يفعل ذلك باستخدام مؤقّت.
- في
notes.js، أضف أمرremind. الكلمة التي تليه هي رقم ملاحظة، ويُتحقَّق منه بالطريقة نفسها المتبعة فيdone، لذا يمكنك إعادة استخدامnoteNumber. - ابدأ
setIntervalواحدًا بتأخير قدره 200 ملي ثانية. في كل نبضة، اطبع سطرًا واحدًا: أولًا3، ثم2، ثم1، ثم نص الملاحظة. - بعد طباعة الملاحظة، أوقف الفاصل باستخدام
clearInterval، لكي ينتهي البرنامج.
مع الملاحظتين Buy milk وCall Ada، يطبع node notes.js remind 2 هذه الأسطر، سطرًا كل 200 ملي ثانية:
3
2
1
Call Ada- إذا لم يكن الرقم رقم ملاحظة، فسيحدث الإخفاق بالطريقة نفسها المتبعة في
done. مع وجود ملاحظتين، يطبعnode notes.js remind 9No note 9إلى stderr وينتهي برمز خروج 1، من دون بدء العد التنازلي.
جرّب ذلك: اكتب remind 1 في المربع بعد $ node notes.js واضغط على Enter. سترى العد التنازلي، ثم ملاحظتك الأولى. بعد ذلك اكتب remind 9: سترى No note 9 باللون الأحمر ورمز الخروج 1. إذا نسيت clearInterval، فلن ينتهي البرنامج من تلقاء نفسه، وستوقفه الوحدة الطرفية بعد 5 ثوانٍ.
جرّب بنفسك
// تبدأ أداة الملاحظات الخاصة بك هنا.
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);
}
جميع دروس أساسيات Node.js
1تشغيل JavaScript على Node
مرحبًا يا Nodeقراءة الأمروسائط سطر الأوامرالأوامر4البرمجة غير المتزامنة في Node
استخدام نتيجة دالة الاستدعاءدوال الاستدعاءنتيجة Promiseعندما يفشل Promiseالوعودانتظار قيمةAsync وAwaitقراءتان مستقلتانPromise.allحلقة الأحداثالمؤقتاتتدرّب بنفسك: Playground لـ Express