Menu
CoddyTech

المؤقتات

جزء من قسم أساسيات 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.

challenge icon

التحدي

سهل

يُعَدّ التذكير تنازليًا على الشاشة قبل عرض الملاحظة. أضف أمر remind يفعل ذلك باستخدام مؤقّت.

  1. في notes.js، أضف أمر remind. الكلمة التي تليه هي رقم ملاحظة، ويُتحقَّق منه بالطريقة نفسها المتبعة في done، لذا يمكنك إعادة استخدام noteNumber.
  2. ابدأ setInterval واحدًا بتأخير قدره 200 ملي ثانية. في كل نبضة، اطبع سطرًا واحدًا: أولًا 3، ثم 2، ثم 1، ثم نص الملاحظة.
  3. بعد طباعة الملاحظة، أوقف الفاصل باستخدام clearInterval، لكي ينتهي البرنامج.

مع الملاحظتين Buy milk وCall Ada، يطبع node notes.js remind 2 هذه الأسطر، سطرًا كل 200 ملي ثانية:

3
2
1
Call Ada
  1. إذا لم يكن الرقم رقم ملاحظة، فسيحدث الإخفاق بالطريقة نفسها المتبعة في done. مع وجود ملاحظتين، يطبع node notes.js remind 9 No 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

تدرّب بنفسك: Playground لـ Express