Estou escrevendo um Javascript que interage com o código da biblioteca que não possuo e não pode (razoavelmente) alterar. Ele cria tempos limite de Javascript usados para mostrar a próxima pergunta em uma série de perguntas com limite de tempo. Este não é um código real porque está ofuscado além de toda esperança. Aqui está o que a biblioteca está fazendo:
....
// 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 );
Quero colocar uma barra de progresso na tela que preenche questionTime * 1000
interrogando o cronômetro criado por setTimeout
. O único problema é que parece não haver maneira de fazer isso. Existe uma getTimeout
função que estou perdendo? A única informação sobre tempos limite de Javascript que posso encontrar está relacionada apenas à criação via setTimeout( function, time)
e exclusão via clearTimeout( id )
.
Estou procurando uma função que retorna o tempo restante antes que um tempo limite seja acionado ou o tempo decorrido após a chamada de um tempo limite. Meu código de barras de progresso é assim:
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: Como encontro o tempo restante antes de um setTimeout () javascript?
Aqui está a solução que estou usando agora. Passei pela seção da biblioteca responsável pelos testes e desembaralhei o código (terrível e contra minhas permissões).
// 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 );
e aqui está meu código:
// wrapper para setTimeout function mySetTimeout (func, timeout) { tempos limite [n = setTimeout (func, tempo limite)] = { start: new Date (). getTime (), fim: nova data (). getTime () + tempo limite t: tempo limite } return n; }
Isso funciona muito bem em qualquer navegador que não seja o IE 6. Até mesmo no iPhone original, onde eu esperava que as coisas ficassem assíncronas.