J'écris du Javascript qui interagit avec du code de bibliothèque qui ne m'appartient pas et que je ne peux pas (raisonnablement) modifier. Il crée des délais d'attente Javascript utilisés pour afficher la question suivante dans une série de questions limitées dans le temps. Ce n'est pas du vrai code car il est obscurci au-delà de tout espoir. Voici ce que fait la bibliothèque :
....
// 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 );
Je veux mettre une barre de progression à l'écran qui se remplit vers questionTime * 1000
en interrogeant le timer créé par setTimeout
. Le seul problème est qu'il semble n'y avoir aucun moyen de le faire. Existe-t-il un getTimeout
fonction que j'ai manquée ? Les seules informations sur les délais d'attente en Javascript que j'ai pu trouver concernent uniquement la création via setTimeout( function, time)
et la suppression via clearTimeout( id )
.
Je cherche une fonction qui renvoie soit le temps restant avant le déclenchement d'un délai d'attente, soit le temps écoulé après le déclenchement d'un délai d'attente. Le code de ma barre de progression ressemble à ceci :
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 : Comment trouver le temps restant avant un javascript setTimeout() ?
Voici la solution que j'utilise actuellement. Je suis passé par la section de la bibliothèque qui est en charge des tests, et j'ai débrouillé le code (terrible, et contre mes permissions).
// 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 );
et voici mon code :
// 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;
}
Cela fonctionne parfaitement dans tous les navigateurs qui ne sont pas IE 6. Même l'iPhone original, où je m'attendais à ce que les choses deviennent asynchrones.