Rumah > hujung hadapan web > tutorial js > Mengapakah `setTimeout()` dan `setInterval()` JavaScript Tidak Tepat, dan Bagaimana Saya Boleh Mencipta Pemasa yang Lebih Tepat?

Mengapakah `setTimeout()` dan `setInterval()` JavaScript Tidak Tepat, dan Bagaimana Saya Boleh Mencipta Pemasa yang Lebih Tepat?

Patricia Arquette
Lepaskan: 2024-12-13 14:52:12
asal
548 orang telah melayarinya

Why Are JavaScript's `setTimeout()` and `setInterval()` Inaccurate, and How Can I Create a More Precise Timer?

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);
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan