Estoy escribiendo algo de Javascript que interactúa con el código de la biblioteca que no soy de mi propiedad y que no puedo (razonablemente) cambiar. Crea tiempos de espera de Javascript que se utilizan para mostrar la siguiente pregunta en una serie de preguntas de tiempo limitado. Este no es un código real porque está ofuscado más allá de toda esperanza. Esto es lo que está haciendo la biblioteca:
....
// 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 );
Quiero poner una barra de progreso en pantalla que se llene questionTime * 1000
al interrogar el temporizador creado por setTimeout
. El único problema es que parece que no hay forma de hacer esto. ¿Hay una getTimeout
función que me falta? La única información sobre los tiempos de espera de Javascript que puedo encontrar está relacionada únicamente con la creación setTimeout( function, time)
y eliminación mediante clearTimeout( id )
.
Estoy buscando una función que devuelva el tiempo restante antes de que se active un tiempo de espera o el tiempo transcurrido después de que se haya llamado a un tiempo de espera. Mi código de barras de progreso se ve así:
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: ¿Cómo encuentro el tiempo restante antes de un setTimeout () de javascript?
Aquí está la solución que estoy usando ahora. Revisé la sección de la biblioteca que está a cargo de las pruebas y descifré el código (terrible y en contra de mis permisos).
// 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 );
y aquí está mi código:
// contenedor para setTimeout function mySetTimeout (func, timeout) { tiempos de espera [n = setTimeout (func, timeout)] = { inicio: nueva fecha (). getTime (), fin: nueva fecha (). getTime () + tiempo de espera t: tiempo de espera } return n; }
Esto funciona bastante bien en cualquier navegador que no sea IE 6. Incluso en el iPhone original, donde esperaba que las cosas se volvieran asincrónicas.