Ada dua jenis fungsi penghitung waktu (kebanyakan digunakan) dalam javascript setTimeout
dan setInterval
( lainnya )
Kedua metode ini memiliki tanda tangan yang sama. Mereka mengambil fungsi panggilan balik dan menunda waktu sebagai parameter.
setTimeout
dieksekusi hanya sekali setelah penundaan sedangkan setInterval
terus memanggil fungsi callback setelah setiap penundaan milidetik.
kedua metode ini mengembalikan pengenal bilangan bulat yang dapat digunakan untuk menghapusnya sebelum timer kedaluwarsa.
clearTimeout
dan clearInterval
kedua metode ini mengambil pengenal integer yang dikembalikan dari fungsi di atas setTimeout
dansetInterval
Contoh:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
Jika Anda menjalankan kode di atas, Anda akan melihat bahwa itu mengingatkan before setTimeout
dan after setTimeout
akhirnya mengingatkan I am setTimeout
setelah 1sec (1000 ms)
Apa yang dapat Anda perhatikan dari contoh adalah bahwa setTimeout(...)
asynchronous yang berarti tidak menunggu timer untuk berlalu sebelum pergi ke pernyataan berikutnya yaitualert("after setTimeout");
Contoh:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
Jika Anda menjalankan kode di atas, Anda akan melihat bahwa itu mengingatkan before setInterval
dan after setInterval
akhirnya memberitahu I am setInterval
5 kali setelah 1sec (1000 ms) karena setTimeout menghapus timer setelah 5 detik atau setiap 1 detik Anda akan mendapatkan peringatan tak I am setInterval
terhingga.
Bagaimana browser secara internal melakukannya?
Saya akan jelaskan secara singkat.
Untuk memahami bahwa Anda harus tahu tentang antrian acara dalam javascript. Ada antrian acara yang diterapkan di browser. Setiap kali suatu peristiwa dipicu dalam js, semua peristiwa ini (seperti klik dll.) Ditambahkan ke antrian ini. Ketika browser Anda tidak memiliki apa-apa untuk dieksekusi, dibutuhkan suatu acara dari antrian dan mengeksekusi mereka satu per satu.
Sekarang, ketika Anda menelepon setTimeout
atau setInterval
panggilan balik Anda didaftarkan ke timer di browser dan itu akan ditambahkan ke antrian acara setelah waktu yang diberikan berakhir dan akhirnya javascript mengambil acara dari antrian dan menjalankannya.
Ini terjadi demikian, karena mesin javascript adalah utas tunggal dan mereka hanya dapat mengeksekusi satu hal pada satu waktu. Jadi, mereka tidak dapat mengeksekusi javascript lain dan melacak timer Anda. Itulah mengapa timer ini terdaftar dengan browser (browser tidak satu threaded) dan dapat melacak timer dan menambahkan acara dalam antrian setelah timer berakhir.
hal yang sama terjadi setInterval
hanya dalam kasus ini acara ditambahkan ke antrian lagi dan lagi setelah interval yang ditentukan sampai dibersihkan atau halaman browser di-refresh.
Catatan
Parameter penundaan yang Anda berikan ke fungsi-fungsi ini adalah waktu tunda minimum untuk menjalankan panggilan balik. Ini karena setelah penghitung waktu kedaluwarsa browser menambahkan acara ke antrian untuk dieksekusi oleh mesin javascript tetapi pelaksanaan panggilan balik tergantung pada posisi acara Anda dalam antrian dan karena mesin berulir tunggal, ia akan menjalankan semua peristiwa dalam antrian satu per satu.
Karenanya, panggilan balik Anda kadang-kadang membutuhkan waktu lebih dari waktu tunda yang ditentukan untuk dipanggil secara khusus ketika kode Anda yang lain memblokir utas dan tidak memberikan waktu untuk memproses apa yang ada dalam antrian.
Dan seperti yang saya sebutkan javascript adalah utas tunggal. Jadi, jika Anda memblokir utasnya lama.
Suka kode ini
while(true) { //infinite loop
}
Pengguna Anda mungkin mendapatkan pesan yang mengatakan halaman tidak merespons .
setTimeout(function(){/*YourCode*/},1000);