Я пишу некоторый 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
function mySetTimeout (func, timeout) {
таймауты [n = setTimeout (func, timeout)] = {
начало: новая дата (). getTime (),
конец: новая дата (). getTime () + тайм-аут
t: тайм-аут
}
return n;
}
Это прекрасно работает в любом браузере, кроме IE 6. Даже в оригинальном iPhone, где я ожидал, что все будет асинхронным.