Pemasa JavaScript Tepat: Satu Analisis
Ramai pembangun biasanya menggunakan kaedah setTimeout() atau setInterval() untuk mencipta pemasa. Walau bagaimanapun, kaedah ini tidak mempunyai jaminan ketepatan. Mereka mungkin mengalami ketinggalan sewenang-wenangnya, tergelincir daripada rentak yang dikehendaki.
Punca Ketidaktepatan
Isu yang wujud berpunca daripada mekanisme yang digunakan oleh setTimeout() dan setInterval(). Fungsi ini bergantung pada gelung acara penyemak imbas, yang tidak dijamin untuk dilaksanakan pada selang masa yang konsisten. Masa pelaksanaan sebenar boleh berbeza-beza berdasarkan beban penyemak imbas, sumber sistem dan faktor lain.
Mencipta Pemasa Tepat
Untuk menangani isu ini, pembangun harus memanfaatkan Tarikh objek untuk mendapatkan cap waktu yang tepat (milisaat-tepat). Selepas itu, mereka harus mendasarkan logik mereka pada nilai masa semasa dan bukannya bergantung pada kiraan pelaksanaan.
Untuk pemasa atau jam yang mudah, mengekalkan perbezaan masa secara eksplisit ialah pendekatan yang berdaya maju:
var start = Date.now(); setInterval(function() { var delta = Date.now() - start; // milliseconds elapsed since start // ... // Output in seconds console.log(Math.floor(delta / 1000)); }, 1000);
Walau bagaimanapun, teknik ini boleh membawa kepada nilai gelisah kerana potensi ketinggalan dalam pelaksanaan selang waktu. Untuk mengurangkan perkara ini, pembangun boleh mempertimbangkan untuk mengemas kini selang dengan lebih kerap, seperti setiap 100ms.
Teknik Lanjutan: Pemasa Penyesuaian Sendiri
Untuk selang masa yang mantap tanpa hanyut, diri -melaraskan pemasa menawarkan penyelesaian lanjutan. Pemasa ini melaraskan kelewatan secara dinamik antara pelaksanaan berikutnya berdasarkan masa berlalu sebenar:
var interval = 1000; // ms var expected = Date.now() + interval; setTimeout(step, interval); function step() { var dt = Date.now() - expected; // drift if (dt > interval) { // Handling severe drift here } // ... Perform desired action expected += interval; setTimeout(step, Math.max(0, interval - dt)); // Adjust delay to correct for drift }
Atas ialah kandungan terperinci Mengapakah `setTimeout()` dan `setInterval()` JavaScript Tidak Tepat, dan Bagaimana Saya Boleh Mencipta Pemasa yang Lebih Tepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!