Я пишу 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, де я очікував, що все стане асинхронним.