Я пишу Javascript, який взаємодіє з кодом бібліотеки, яким я не володію, і не може (розумно) змінити. Він створює час очікування Javascript, який використовується для показу наступного запитання у серії обмежених у часі питань. Це не справжній код, оскільки він затуманений поза всякими надіями. Ось що робить бібліотека:
....
// 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 );
Я хочу розмістити на екрані індикатор прогресу, який заповнюється questionTime * 1000
шляхом опитування таймера, створеного setTimeout
. Єдина проблема полягає в тому, що, здається, немає можливості зробити це. Чи є якась getTimeout
функція, якої мені не вистачає? Єдина інформація про час очікування Javascript, яку я можу знайти, стосується лише створення через setTimeout( function, time)
та видалення через clearTimeout( id )
.
Я шукаю функцію, яка повертає або час, що залишився до запуску тайм-ауту, або час, що минув після виклику тайм-ауту. Мій штрих-код прогресу виглядає так:
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: Як знайти час, що залишився до JavaScript setTimeout ()?
Ось рішення, яке я використовую зараз. Я пройшов розділ бібліотеки, який відповідає за тести, і розшифрував код (страшно, і всупереч моїм дозволам).
// 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 );
і ось мій код:
// обгортка для setTimeout функція mySetTimeout (func, timeout) { таймаути [n = setTimeout (func, timeout)] = { start: new Date (). getTime (), кінець: нова дата (). getTime () + час очікування t: час очікування } повернути n; }
Це працює досить помітно в будь-якому браузері, який не є IE 6. Навіть оригінальний iPhone, де я очікував, що все стане асинхронним.