Cara bermain Debounce Bel Pintu
- Baca instruksi level. Di bawah editor tertulis cara game memasang fungsimu, mis.
pintu.bel = debounce(bunyi, 300);. - Tulis fungsi peredamnya di editor.
setTimeout,clearTimeout, danDate.now()memakai jam virtual, jadi tidak ada yang perlu ditunggu. - Game memutar rangkaian tekanan level ke
pintu.bel. Garis waktu diperbarui setiap kamu mengetik: titik hitam untuk tekanan, pita untuk timer (oranye berbunyi, abu dihapus), titik hijau atau merah untuk panggilanmu, dan lingkaran hijau untuk target. - Tabel di bawahnya membandingkan tiap panggilan: waktu, argumen, dan mulai level 4 juga
this. - Tekan Cek jawaban atau Ctrl + Enter. Yang dicek adalah jadwal panggilan fungsi asli, bukan teks kodemu, jadi cara lain yang hasilnya sama juga benar.
- Kalau buntu, buka Petunjuk. Petunjuk pertama mengarahkan, petunjuk terakhir hampir menjawab.
- Level yang sudah selesai tetap tercentang saat kamu kembali dengan browser yang sama.
Yang kamu pelajari
- Level 1
Menunda dengan setTimeout
Fungsi pembungkus yang menjadwalkan
fnjalanmsmilidetik kemudian, bukan seketika. - Level 2
Debounce
Tiap panggilan membatalkan timer sebelumnya dengan
clearTimeout, jadifnhanya jalan setelah rentetan berhenti selamams. - Level 3
Argumen terakhir
Rest parameter
...argsmenangkap argumen tiap panggilan, dan timer memakai milik panggilan terakhir. - Level 4
Meneruskan this
Kembalikan
functionbiasa, bukan arrow function, lalu jalankanfn.apply(this, args)supaya method tetap tahu objeknya. - Level 5
Membatalkan dengan cancel
Fungsi juga objek, jadi bisa diberi method
cancelyang menghapus timer yang masih menunggu. - Level 6
Opsi leading
Debounce yang jalan di panggilan pertama, lalu diam sampai rentetan berhenti.
- Level 7
Throttle
Paling sering sekali tiap
ms, dihitung dari kapanfnterakhir jalan, meski panggilan terus datang. - Level 8
Memilih debounce atau throttle
Pencarian menunggu pengguna selesai mengetik, scroll butuh pembaruan berkala, dan tombol bayar butuh debounce leading.
Debounce menunggu jeda, throttle membagi jatah
Debounce dengan 300 ms menunggu sampai tidak ada panggilan selama 300 ms. Selama panggilan terus datang lebih rapat dari itu, fn tidak pernah jalan. Cocok untuk kotak pencarian: yang penting kata terakhir, bukan tiap huruf.
Throttle dengan 200 ms menjalankan fn paling sering sekali tiap 200 ms, berapa pun panggilan yang datang. Cocok untuk scroll atau resize yang butuh pembaruan berkala selama pengguna masih bergerak. Kalau ragu, tanyakan: apakah kamu butuh hasil akhirnya saja (debounce), atau butuh pembaruan selama prosesnya (throttle)?
Tanya jawab
Apakah harus daftar akun untuk bermain?
Tidak. Semua level bisa dimainkan tanpa akun. Kemajuanmu disimpan di browser yang kamu pakai, jadi akan hilang kalau data browser dihapus.
Apa beda debounce dan throttle?
Debounce menunggu sampai panggilan berhenti selama ms, lalu jalan sekali. Throttle jalan paling sering sekali tiap ms selama panggilan terus datang. Di level 7, Dodi menekan bel tiap 60 ms selama satu detik: debounce baru berbunyi setelah ia berhenti, throttle 200 ms berbunyi lima kali.
Kenapa this hilang di debounce yang memakai arrow function?
Arrow function tidak punya this sendiri. Kalau debounce mengembalikan arrow function, pintu.bel() tidak bisa memberinya this = pintu. Kembalikan function biasa, lalu teruskan dengan fn.apply(this, args). Arrow function di dalam setTimeout boleh tetap dipakai karena ia mengambil this dari fungsi pembungkusnya.
Throttle-ku memakai setTimeout, bukan Date.now. Apakah tetap benar?
Ya. Yang dicek adalah kapan fungsi asli jalan dan dengan argumen apa. Throttle berbasis timer dan berbasis Date.now() menghasilkan jadwal yang sama di level ini.
Kenapa tombol bayar tidak memakai throttle?
Throttle membuka jatah baru tiap ms, jadi pembeli yang terus mengeklik tetap membayar dua kali begitu 500 ms lewat. Debounce dengan { leading: true } jalan di klik pertama dan baru siap lagi setelah klik berhenti selama 500 ms.
Apakah kodeku benar-benar menunggu ratusan milidetik?
Tidak. setTimeout, clearTimeout, dan Date.now() diganti versi jam virtual. Jam melompat ke kejadian berikutnya, jadi garis waktu langsung tampil dan hasilnya selalu sama.