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