Saya menemukan beberapa perilaku yang tidak terduga saat meneruskan nilai milidetik yang besar ke setTimeout()
. Misalnya,
setTimeout(some_callback, Number.MAX_VALUE);
dan
setTimeout(some_callback, Infinity);
keduanya menyebabkan some_callback
untuk dijalankan hampir seketika, seolah-olah saya telah lulus 0
bukannya sejumlah besar sebagai penundaan.
Mengapa ini terjadi?
javascript
settimeout
Matt Ball
sumber
sumber
delay >>> 0
terjadi sesuatu seperti , jadi penundaan yang dilewati adalah nol. Bagaimanapun, fakta bahwa penundaan disimpan sebagai 32-bit unsigned int menjelaskan perilaku ini. Terima kasih!49999861776383
(49999861776384
menyebabkan callback untuk api langsung)49999861776383 % 2147483648 === 2147483647
Kamu bisa memakai:
sumber
Beberapa penjelasan di sini: http://closure-library.googlecode.com/svn/docs/closure_goog_timer_timer.js.source.html
sumber
setTimeout()
, tetapi saya berharap mereka menghitung tanggal dan waktu ketika harus bangun dan tidak mengurangi penghitung pada beberapa centang yang ditentukan secara acak ... (Orang bisa berharap , setidaknya)Lihat dokumen node di Timer di sini: https://nodejs.org/api/timers.html (dengan asumsi yang sama di js juga karena itu istilah yang ada di mana-mana sekarang dalam event loop based
Pendeknya:
Jika penundaan lebih besar dari 2147483647 atau kurang dari 1, penundaan akan disetel ke 1.
dan penundaan adalah:
Jumlah milidetik untuk menunggu sebelum memanggil callback.
Sepertinya nilai waktu tunggu Anda disetel secara default ke nilai yang tidak terduga sesuai aturan ini, mungkin?
sumber
Saya tersandung pada ini ketika saya mencoba untuk mengeluarkan pengguna secara otomatis dengan sesi yang kedaluwarsa. Solusi saya adalah mengatur ulang waktu tunggu setelah satu hari, dan tetap menggunakan fungsionalitas untuk menggunakan clearTimeout.
Berikut adalah contoh prototipe kecil:
Pemakaian:
Dan Anda dapat menghapusnya dengan
stopTimer
metode:sumber
Tidak bisa berkomentar selain menjawab semua orang. Dibutuhkan nilai unsigned (Anda tidak bisa menunggu milidetik negatif jelas) Jadi karena nilai maks adalah "2147483647" ketika Anda memasukkan nilai yang lebih tinggi itu mulai pergi dari 0.
Pada dasarnya penundaan = {VALUE}% 2147483647.
Jadi menggunakan penundaan 2147483648 akan menjadikannya 1 milidetik, oleh karena itu, proses instan.
sumber
sebenarnya bukan bilangan bulat. Nilai maksimum yang diizinkan untuk setTimeout kemungkinan adalah 2 ^ 31 atau 2 ^ 32. Mencoba
dan Anda mendapatkan 1 kembali, bukan 1.7976931348623157e + 308.
sumber
Number.MAX_VALUE
adalah bilangan bulat. Ini adalah bilangan bulat 17976931348623157 dengan 292 angka nol setelahnya. AlasanparseInt
pengembalian1
adalah karena pertama kali mengubah argumennya menjadi string dan kemudian mencari string dari kiri ke kanan. Segera setelah menemukan.
(yang bukan angka), ia berhenti.Number.isInteger(foo)
. Tetapi karena belum didukung, Anda dapat menggunakanMath.round(foo) === foo
sebagai gantinya.Number.MAX_VALUE
bukanlah integer tapi adouble
. Jadi begitulah ... Double bisa mewakili integer, karena digunakan untuk menyimpan integer 32 bit di JavaScript.Number.MAX_VALUE
itu bukan integer. Tetapi jika yang Anda maksud dengan "integer" adalah konsep mental "sebuah integer", maka itu adalah integer. Dalam JavaScript, karena semua bilangan adalah floating point 64-bit, maka umum untuk menggunakan definisi konsep mental "integer."Number.MAX_SAFE_INTEGER
tapi itu bukan nomor yang kita cari di sini.