Apakah ada perbedaan?
Iya. Timeout mengeksekusi sejumlah waktu tertentu setelah setTimeout () dipanggil; Interval mengeksekusi sejumlah waktu tertentu setelah interval sebelumnya dipecat.
Anda akan melihat perbedaannya jika fungsi doStuff () Anda membutuhkan waktu untuk dijalankan. Misalnya, jika kami mewakili panggilan ke setTimeout / setInterval with .
, penembakan timeout / interval dengan *
dan eksekusi kode JavaScript dengan [-----]
, garis waktu terlihat seperti:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
Komplikasi berikutnya adalah jika interval menyala sementara JavaScript sudah sibuk melakukan sesuatu (seperti menangani interval sebelumnya). Dalam hal ini, interval diingat, dan terjadi segera setelah penangan sebelumnya selesai dan mengembalikan kontrol ke browser. Jadi misalnya untuk proses doStuff () yang terkadang pendek ([-]) dan kadang-kadang panjang ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• merepresentasikan interval firing yang tidak bisa langsung mengeksekusi kodenya, dan malah ditunda.
Jadi interval mencoba untuk 'mengejar ketinggalan' untuk kembali sesuai jadwal. Tapi, mereka tidak mengantri satu di atas satu sama lain: hanya akan ada satu eksekusi tertunda per interval. (Jika mereka semua antri, browser akan dibiarkan dengan daftar eksekusi yang terus berkembang!)
. * • • x • • x
[------][------][------][------]
x mewakili penembakan interval yang tidak bisa mengeksekusi atau dibuat tertunda, jadi malah dibuang.
Jika fungsi doStuff () Anda biasanya membutuhkan waktu lebih lama untuk dieksekusi daripada interval yang ditetapkan untuk itu, browser akan memakan 100% CPU yang mencoba untuk melayaninya, dan mungkin menjadi kurang responsif.
Yang mana yang Anda gunakan dan mengapa?
Chained-Timeout memberikan slot waktu luang yang dijamin ke browser; Interval mencoba memastikan fungsi yang dijalankannya dijalankan sedekat mungkin dengan waktu yang dijadwalkan, dengan mengorbankan ketersediaan browser UI.
Saya akan mempertimbangkan interval untuk animasi satu kali. Saya ingin menjadi semulus mungkin, sementara waktu yang dirantai lebih sopan untuk animasi yang sedang berlangsung yang akan berlangsung sepanjang waktu saat halaman dimuat. Untuk penggunaan yang kurang menuntut (seperti updater sepele menembak setiap 30 detik atau sesuatu), Anda dapat menggunakan keduanya dengan aman.
Dalam hal kompatibilitas browser, setTimeout mendahului setInterval, tetapi semua browser yang Anda temui hari ini mendukung keduanya. Penyerang terakhir selama bertahun-tahun adalah IE Mobile di WinMo <6.5, tetapi mudah-mudahan itu juga sekarang di belakang kita.