Estoy escribiendo un código JavaScript que interactúa con el código de la biblioteca que no soy de mi propiedad y no puedo (razonablemente) cambiar. Crea tiempos de espera de Javascript utilizados 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 la biblioteca está haciendo:encuentra el tiempo restante en un setTimeout()?
....
// 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 llena hacia questionTime * 1000
interrogando el temporizador creado por setTimeout
. El único problema es que parece que no hay forma de hacer esto. ¿Hay una función getTimeout
que me falta? La única información sobre los tiempos de espera de Javascript que puedo encontrar está relacionada solo con la creación a través del setTimeout(function, time)
y la eliminación a través del clearTimeout(id)
.
Estoy buscando una función que devuelva el tiempo restante antes de que se agote el tiempo de espera o el tiempo transcurrido después de que se haya invocado un tiempo de espera. Mi código de barra 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 puedo encontrar el tiempo restante antes de que un setTimeout() de JavaScript?
Aquí está la solución que estoy usando ahora. Pasé por 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:
// 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; }
Esto funciona bastante en el clavo en cualquier navegador que no es Internet Explorer 6. Incluso el iPhone original, donde esperaba cosas para obtener asíncrono.
Gracias ¡Me salvaste el día! – xecutioner
Debido al tiempo de ejecución, esto puede derivar en unos pocos milisegundos durante un tiempo. Una forma más segura de hacerlo es registrar el momento en que comenzó el tiempo de espera (nueva fecha()) y luego restarlo de la hora actual (otra fecha nueva()) –