Piszę trochę Javascript, który współdziała z kodem biblioteki, którego nie jestem właścicielem i nie mogę (rozsądnie) zmienić. Tworzy limity czasu JavaScript używane do wyświetlania następnego pytania w serii pytań ograniczonych w czasie. To nie jest prawdziwy kod, ponieważ jest zaciemniony poza wszelką nadzieją. Oto, co robi biblioteka:
....
// 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 );
Chcę umieścić na ekranie pasek postępu, który zapełnia się, questionTime * 1000
sprawdzając licznik czasu utworzony przez setTimeout
. Jedynym problemem jest to, że wydaje się, że nie da się tego zrobić. Czy jest getTimeout
funkcja, której mi brakuje? Jedyne informacje na temat limitów czasu Javascript, które mogę znaleźć, dotyczą tylko tworzenia setTimeout( function, time)
i usuwania przez clearTimeout( id )
.
Szukam funkcji, która zwraca czas pozostały do uruchomienia limitu czasu lub czas, który upłynął po wywołaniu limitu czasu. Mój kod paskowy postępu wygląda następująco:
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: Jak znaleźć czas pozostały do wykonania setTimeout () w javascript?
Oto rozwiązanie, którego teraz używam. Przejrzałem sekcję biblioteki, która jest odpowiedzialna za testy, i rozszyfrowałem kod (okropne i wbrew moim uprawnieniom).
// 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 );
a oto mój kod:
// opakowanie dla setTimeout function mySetTimeout (func, timeout) { timeouts [n = setTimeout (func, timeout)] = { start: new Date (). getTime (), end: new Date (). getTime () + timeout t: limit czasu } return n; }
Działa to bardzo dobrze w każdej przeglądarce innej niż IE 6. Nawet w oryginalnym iPhonie, w którym spodziewałem się, że wszystko będzie asynchroniczne.