Diskuze: setInterval problem
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 3 zpráv z 3.
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
moc jsem to pravděpodobně nepochopil, proč měříš čas podle sebe?
Pokud by to mělo být měření generování stránky, můžeš jednoduše spočítat rozdíl. Dejme tomu, že chceš dobu načítaní mezi document (pouze stránka) a window (celá stránka včetně skriptů, stylu, obrázků apod.).
var docTime;
var winTime;
document.addEventListener("DOMContentLoaded", function() {
docTime = parseInt(new Date().getTime());
});
window.addEventListener("load", function() {
winTime = parseInt(new Date().getTime());
alert(“Načítaní trvalo: ” + (winTime - docTime));
});
A proč tomu tak je?
“Jádro operačního systému velmi rychle střídá na procesoru běžící
procesy” [http://cs.wikipedia.org/…Multitasking]
Jak nám praví Wikipedia, prohlížeč se rychle střídá s jinými aplikacemi a tak vzniká zpoždění, je sice velice málé - v řádech milisekund, či méně - ale je. Sice jsou tam málé nepřesnosti, avšak jak sám píšeš, při delším sledování je rozdíl značně znát.
Ošetření
Aby byl setInterval přesný, budeš si muset vytvořit vlastní intervalovou
funkci, která se bude kontrolovat podle času.
Se svým svolením, jelikož naštěstí pro naše ušetření času nejsi
jediný, kdo si tohoto problému všiml, jsem si půjčil již vytvořenou
funkci:
[https://gist.github.com/manast/1185904]
Použití:
//presny interval//
function interval(duration, fn){
this.baseline = undefined;
this.run = function(){
if(this.baseline === undefined){
this.baseline = new Date().getTime();
}
fn();
var end = new Date().getTime();
this.baseline += duration;
var nextTick = duration - (end - this.baseline);
if(nextTick<0){
nextTick = 0;
}
(function(i){
i.timer = setTimeout(function(){
i.run(end);
}, nextTick);
}(this));
};
this.stop = function(){
clearTimeout(this.timer);
};
}
//////////////////
var startTime = Date.now();
var mujInterval = new interval(1000, function(){ //deklarace
(console.log((Date.now() - startTime) + 'ms')); // tvuj kod
})
mujInterval.run() //spusteni
mujInterval.stop() //vypnuti
Zobrazeno 3 zpráv z 3.