Domanda

Oggi mi è stato introdotto al mondo dei lavoratori Web in JavaScript. Questo mi ha fatto ripensare timer. Ho usato per i timer di programma il modo brutto, come questo.

var time = -1;
function timerTick()
{
    time++;
    setTimeout("timerTick()",1000);
    $("#timeI").html(time);
}

So che questo potrebbe essere migliorata salvando la data in cui si avvia il timer, ma non sono mai stato un fan di questo.

Ora mi si avvicinò con un metodo che utilizza lavoratori web, ho fatto un po 'di riferimento e l'ho trovato molto più affidabile. Dato che non sono un esperto di JavaScript Vorrei sapere se questa funzione è corretto o che problemi potrebbe avere grazie in anticipo.

Codice mio JavaScript (si prega di notare che uso JQuery):

$(function() {
    //-- Timer using web worker. 
    var worker = new Worker('scripts/task.js'); //External script
    worker.onmessage = function(event) {    //Method called by external script
        $("#timeR").html(event.data)
    };
};

Lo script esterno ( 'scripts / task.js'):

var time = -1;
function timerTick()
{
    time++;
    setTimeout("timerTick()",1000);
    postMessage(time);
}
timerTick();

È anche possibile visualizzare una demo in diretta su mio sito web .

È stato utile?

Soluzione

Se si sta cercando di visualizzare in modo affidabile secondo ticchettio da, quindi l'unico modo affidabile per farlo è quello di ottenere il tempo corrente in partenza e utilizzare il timer SOLO per l'aggiornamento dello schermo. Su ogni tick, si ottiene l'ora corrente, calcolare i secondi trascorsi effettivi e visualizzare quello. Né setTimeout()setInterval() sono garantiti o può essere usato per contare con precisione il tempo.

Si può fare in questo modo:

var start = +(new Date);
setInterval(function() {
    var now = +(new Date);
    document.getElementById("time").innerHTML = Math.round((now - start)/1000);
}, 1000);

Se il browser viene occupato e timer sono irregolarmente distanziati, si può ottenere un aggiornamento leggermente irregolare sullo schermo, ma il tempo trascorso rimarrà preciso quando lo schermo viene aggiornato. Il tuo metodo è suscettibile di accumulare errore nel tempo trascorso.

Si può vedere questo lavoro qui: http://jsfiddle.net/jfriend00/Gfwze/

Altri suggerimenti

Il timer più preciso sarebbe stato un confronto tra due marche temporali. Si potrebbe aumentare la precisione del timer aggiornando più frequentemente (ad esempio ogni 100 ms). Io preferisco usare setInterval() sopra setTimeout().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top