javascript - Mengenai mekanisme pelaksanaan setInterval
过去多啦不再A梦
过去多啦不再A梦 2017-05-19 10:35:06
0
2
654

//Kemas kini: Soalan ini tidak mempunyai nilai rujukan dan agak mengelirukan saya telah memohon untuk menutupnya. Untuk butiran, sila lihat jawapan saya di bawah

Saya melihat blog yang disebut dua hari lalu: Jika masa pelaksanaan fungsi panggil balik setInterval lebih besar daripada masa tunda yang ditentukan, apabila pemasa dicetuskan, jika baris gilir tugas mempunyai fungsi panggil balik untuk pemasa yang sama, maka panggil balik ini akan Diabaikan, yang bermaksud bahawa tidak akan ada dua atau lebih fungsi panggil balik pemasa yang sama dalam baris gilir tugas. Kenyataan tidak jelas, lihat sahaja kod:

Contoh 1

(function(){
    var j=1;
    var start=new Date().getTime();
    var timr=setInterval(function(){
        console.log("第"+j+"次定时器开始时间:"+(new Date().getTime()-start));
        for(var i=0;i<5000;i++){console.log("")};
        console.log("第"+j+"次定时器结束时间:"+(new Date().getTime()-start));
        j++;
    },100);
    setTimeout(function(){
        clearInterval(timr)
    },1000)
})()

setInterval menambah fungsi pada baris gilir tugas setiap 100ms, dan setInterval dikosongkan selepas 1000ms. Terangkan keputusan ini mengikut pernyataan di atas:

  1. Letakkan gelung untuk pertama ke dalam baris gilir tugasan pada 100ms, dan utas utama terbiar mula melaksanakan gelung ini, yang mengambil masa 863ms

  2. Semasa pelaksanaan gelung pertama, pemasa kedua dicetuskan pada 200ms, dan gelung kedua untuk dimasukkan ke dalam baris gilir tugasan kosong sehingga utas utama melahu dan mula melaksanakan gelung kedua selepas 964ms;

  3. Apabila pemasa (nombor jujukan teori) dicetuskan daripada kali ketiga hingga kelapan, utas utama melaksanakan gelung pertama untuk, dan terdapat gelung kedua dalam baris gilir tugas, jadi fungsi ini diabaikan dan tugasan tidak dimasukkan
  4. Pada 900ms, pemasa kesembilan dicetuskan, dan utas utama melaksanakan gelung kedua untuk fungsi pemasa ini tidak wujud dalam baris gilir tugas, jadi fungsi pemasa ini dimasukkan ke dalam baris gilir tugas, iaitu. hasilnya. "pemasa ke-3"

  5. Pada 1000ms, pemasa kesepuluh dicetuskan dan diabaikan atas sebab yang sama seperti pemasa ketiga Selepas itu, setInterval dikosongkan.

  6. Contoh 2

  7. Tetapi keputusan ujian contoh lain tidak seperti ini
for(var i=0;i<10000;i++){
    console.log(1)
}
setInterval(function(){
    console.log("定时器")
},1000)

Pelayar mula-mula melaksanakan gelung for, yang mengambil masa kira-kira 13 saat pada komputer saya (komputer sangat teruk... Menurut kenyataan di atas, selama 13 saat ini, hanya akan ada satu fungsi pemasa ini dalam baris gilir tugas. Kemudian hasil yang sedang dijalankan adalah untuk mencetak 13 "pemasa" pada masa yang sama selepas 13 saat, dan kemudian melaksanakan fungsi dalam tempoh satu saat.

Soalan

Dua contoh di atas bercanggah Bagaimanakah setInterval berfungsi dalam kes ini? Saya harap saya dapat memberi anda jawapan yang jelas, sebaik-baiknya dengan maklumat yang berwibawa. Terima kasih Dakar.

过去多啦不再A梦
过去多啦不再A梦

membalas semua(2)
Ty80

Saya bertanya soalan ini, dan sekarang saya sedar ia agak mengelirukan. . .
Dalam contoh kedua, benang js telah diduduki semasa pelaksanaan gelung for, dan pernyataan berikut belum dihuraikan, iaitu pemasa belum didaftarkan. Ubah suai contoh dan tambah masa pelaksanaan:

var start=new Date().getTime();
for(var i=0;i<10000;i++){
    console.log(1)
}
console.log("耗时"+(new Date().getTime()-start))
setInterval(function(){
    console.log("定时器"+(new Date().getTime()-start))
},1000)

Ia akan menjadi jelas apabila anda menggunakan contoh ini untuk ujian. Gelung untuk di atas dilaksanakan selama kira-kira 1544ms Pada masa ini, utas js menghuraikan pernyataan, pemasa telah didaftarkan, dan kemudian dilaksanakan seperti biasa.

Jadi tiada percanggahan antara dua contoh Contoh pertama adalah betul Apabila utas utama melaksanakan fungsi pemasa dan baris gilir tugasan mempunyai fungsi pemasa yang sama, semua pencetus pemasa akan diabaikan.

巴扎黑

Walau bagaimanapun, Contoh 2 untuk setInterval tidak dilaksanakan sebelum tamat

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan