Pertanyaan Apakah setInterval drift?


Ini adalah pertanyaan yang sangat sederhana. Jika saya gunakan setInterval(something, 1000), dapatkah saya benar-benar yakin bahwa setelah, katakanlah, 31 hari itu akan memicu "sesuatu" secara tepat 60*60*24*31 waktu? Atau apakah ada risiko untuk disebut drifting?


32
2018-06-12 08:53


asal


Jawaban:


Berikut ini patokan yang dapat Anda jalankan di Firefox:

var start = +new Date();
var count = 0;
setInterval(function () {
    console.log((new Date() - start) % 1000,
    ++count,
    Math.round((new Date() - start)/1000))
}, 1000);

Nilai pertama harus sedekat mungkin dengan 0 atau 1000 (nilai lain menunjukkan bagaimana "off the spot" waktu pemicu terjadi.) Nilai kedua adalah berapa kali kode dipicu, dan nilai ketiga adalah berapa kali bisa harus telah dipicu. Anda akan mencatat bahwa jika Anda mem-boot CPU Anda bisa mendapatkan cukup off the spot, tetapi tampaknya untuk memperbaiki dirinya sendiri. Cobalah untuk menjalankannya untuk jangka waktu yang lebih lama dan lihat bagaimana ia menangani.


17
2018-06-12 09:04



Jawaban singkat: Tidak, Anda tidak bisa yakin. Ya, itu bisa melayang.

Jawaban panjang: John Resig di Akurasi Waktu JavaScript dan Cara Pengatur Waktu JavaScript.

Dari artikel kedua:

Untuk memahami bagaimana pengatur waktu bekerja secara internal ada satu konsep penting yang perlu dieksplorasi: penundaan waktu tidak dijamin. Karena semua JavaScript dalam browser mengeksekusi pada satu utas kejadian asynchronous (seperti klik mouse dan pengatur waktu) hanya berjalan ketika sudah ada pembukaan dalam eksekusi.

Kedua artikel (dan apa pun di situs itu) adalah bacaan yang bagus, begitu juga dengan hal itu.


28
2018-06-12 08:56



(Maaf tentang bahasa Inggrisku yang buruk) Saya memiliki masalah yang sama tentang menghitung mundur fungsi, saya menulis fungsi countdown () dan loop dengan setInterval tetapi hanyut 1-3 milidetik per loop. Kemudian saya menulis fungsi yang mengontrol apakah ada drifting dan memperbaikinya.

Kontrol hanya dengan menit dan detik saja. Ini dia. Ini berfungsi dengan baik untuk saya, saya harap ini akan membantu Anda juga.

$.syncInterval(functionname,interval,controlinterval)

contoh:

countdown(){ some code };
$.syncInterval(countdown,1000,60);

ia mengatakan menjalankan fungsi hitung mundur setiap 1000 milidetik dan periksa setiap 60 detik

di sini adalah kode:

$.syncInterval = function (func,interval,control) { 
        var 
        now=new Date();
        realMinute=now.getMinutes(),
        realSecond=now.getSeconds(),
        nowSecond=realSecond,
        nowMinute=realMinute,
        minuteError=0,
        countingVar=1,
        totalDiff=0;

        var loopthat = setInterval(function(){

        if (nowSecond==0) {
            nowMinute++;
            nowMinute=nowMinute%60;
        };
        if (countingVar==0){

            now=new Date();
            realSecond=now.getSeconds();
            realMinute=now.getMinutes();

            totalDiff=((realMinute*60)+(realSecond))-((nowMinute*60)+(nowSecond));
            if(totalDiff>0){
                for (i=1;i<=totalDiff;i++) {
                    func();
                    nowSecond++;
                    countingVar++;
                };
            } else if (totalDiff==0){
                func();
                nowSecond++;
                countingVar++;
            } else if (totalDiff<0) {

            };
        } else {
            func();
            nowSecond++;
            countingVar++;
        };
        countingVar=countingVar%control;
        nowSecond=nowSecond%60;
    },interval);
};

1
2018-04-29 00:09