Apabila ia datang kepada setInterval, kita perlu menyebut setTimeout Kedua-duanya digunakan untuk melaksanakan fungsi tertentu secara kerap Perbezaannya ialah setTimeout hanya dilaksanakan sekali, manakala setInterval boleh dilaksanakan secara berterusan >
function do_sth() { console.log('Hello...'); }
Salin selepas log masuk
setTimeout(do_sth, 2500); // 2.5 秒后,执行 do_sth 函数(只执行一次)
setInterval(do_sth, 3500); // 3.5 秒后,执行 do_sth 函数(每隔 3.5 秒执行一次,一直执行下去)
Salin selepas log masuk
Pada zahirnya, kedua-duanya mempunyai kegunaan tersendiri dan tiada masalah. Walau bagaimanapun, jika fungsi yang dilaksanakan oleh setInterval adalah tindakan yang memakan masa, setInterval masih akan memanggil fungsi itu mengikut pelan asal, tanpa mengira sebarang penyekatan sebelumnya Dengan cara ini, seiring dengan berlalunya masa, bilangan fungsi yang menunggu untuk dilaksanakan dalam barisan akan bertambah. Penyelesaian kepada masalah ini masih dengan memanggil setTimeout secara rekursif, seperti:
function do_sth() {
console.log('Hello...'); // 即使这里执行比较耗时的动作也没问题,
// 等这里执行完了才会再去调用 setTimeout
setTimeout(do_sth, 2500); // 安排后续执行
}
do_sth(); // 初次执行
Salin selepas log masuk
Kaedah panggilan rekursif ini bukan sahaja boleh mencapai tujuan melaksanakan fungsi tertentu dalam gelung, tetapi juga menghalang tugasan berikutnya daripada terkumpul.
Jika anda rasa kaedah ini agak bertele-tele, anda boleh menulisnya dengan lebih ringkas:
(function() {
console.log('Hello...'); // do something here
setTimeout(arguments.callee, 2500);
})();
Salin selepas log masuk
Itu sahaja, tetapi jika kos tugasan bagi pelaksanaan berjadual adalah kecil, setInterval biasanya tiada masalah, tetapi jika kos tugasan agak tinggi, pastikan anda menggunakan setTimeout.