Menu
CoddyTech

Timer

Termasuk bagian Dasar-Dasar Node.js dalam perjalanan Node.js di Coddy. Pelajaran 27 dari 33.

Pengingat harus menghitung mundur di layar, satu langkah setiap kali, lalu berhenti.

setInterval(fn, ms) menjalankan fn setiap ms milidetik hingga clearInterval(id) menghentikannya; setTimeout berjalan satu kali. Program hanya berakhir jika tidak ada timer tersisa, jadi interval yang tidak pernah kamu hentikan akan membuat program terus berjalan.

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

Terminal menghentikan program setelah 5 detik, sehingga kamu bisa menyadari bahwa kamu lupa memanggil clearInterval.

challenge icon

Tantangan

Mudah

Pengingat menghitung mundur di layar sebelum menampilkan catatan. Tambahkan perintah remind yang melakukan ini dengan timer.

  1. Di notes.js, tambahkan perintah remind. Kata setelahnya adalah nomor catatan, yang diperiksa dengan cara yang sama seperti pada done, jadi kamu bisa menggunakan kembali noteNumber.
  2. Mulai satu setInterval dengan jeda 200 milidetik. Setiap tick mencetak satu baris: pertama 3, lalu 2, kemudian 1, lalu teks catatan.
  3. Setelah mencetak catatan, hentikan interval dengan clearInterval agar program berakhir.

Dengan catatan Buy milk dan Call Ada, node notes.js remind 2 mencetak baris-baris ini, satu setiap 200 milidetik:

3
2
1
Call Ada
  1. Nomor yang bukan nomor catatan akan gagal seperti pada done. Dengan dua catatan, node notes.js remind 9 mencetak No note 9 ke stderr dan keluar dengan kode 1, tanpa menghitung mundur.

Coba: ketik remind 1 di kotak setelah $ node notes.js lalu tekan Enter. Kamu akan melihat hitung mundur, lalu catatan pertamamu. Kemudian ketik remind 9: kamu akan melihat No note 9 berwarna merah dan kode keluar 1. Jika kamu lupa clearInterval, program tidak akan berakhir sendiri, dan terminal akan menghentikannya setelah 5 detik.

Coba sendiri

// Alat pencatatmu dimulai di sini.
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);
}

Semua pelajaran di Dasar-Dasar Node.js

Latihan sendiri: Playground Express