Saya menulis beberapa Javascript yang berinteraksi dengan kode perpustakaan yang tidak saya miliki, dan tidak dapat (secara wajar) ubah. Ini membuat batas waktu Javascript yang digunakan untuk menampilkan pertanyaan berikutnya dalam serangkaian pertanyaan dengan waktu terbatas. Ini bukan kode nyata karena ia dikaburkan di luar harapan. Inilah yang perpustakaan lakukan:
....
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = setTimeout( showNextQuestion(questions[i+1]), t );
Saya ingin meletakkan bilah kemajuan di layar yang terisi questionTime * 1000
dengan menginterogasi pengatur waktu yang dibuat oleh setTimeout
. Satu-satunya masalah adalah, sepertinya tidak ada cara untuk melakukan ini. Apakah ada getTimeout
fungsi yang saya lewatkan? Satu-satunya informasi tentang batas waktu Javascript yang dapat saya temukan hanya terkait dengan pembuatan melalui setTimeout( function, time)
dan penghapusan melalui clearTimeout( id )
.
Saya mencari fungsi yang mengembalikan waktu yang tersisa sebelum batas waktu diaktifkan, atau waktu yang berlalu setelah batas waktu dipanggil. Kode bar kemajuan saya terlihat seperti ini:
var timeleft = getTimeout( test.currentTimeout ); // I don't know how to do this
var $bar = $('.control .bar');
while ( timeleft > 1 ) {
$bar.width(timeleft / test.defaultQuestionTime * 1000);
}
tl; dr: Bagaimana cara menemukan waktu yang tersisa sebelum javascript setTimeout ()?
Inilah solusi yang saya gunakan sekarang. Saya pergi ke bagian perpustakaan yang bertanggung jawab atas tes, dan menguraikan kode (mengerikan, dan bertentangan dengan izin saya).
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = mySetTimeout( showNextQuestion(questions[i+1]), t );
dan inilah kode saya:
// wrapper untuk setTimeout function mySetTimeout (func, timeout) { waktu tunggu [n = setTimeout (func, timeout)] = { mulai: Tanggal baru (). getTime (), akhir: Tanggal baru (). getTime () + batas waktu t: batas waktu } kembali n; }
Ini bekerja cukup tepat di browser apa pun yang bukan IE 6. Bahkan iPhone asli, di mana saya mengharapkan semuanya menjadi asynchronous.