Ho due timer per il conto alla rovescia JavaScript (per un gioco) e una tabella MySQL per ricevere dati dalle chiamate AJAX da uno dei due.Sincronizza due timer JavaScript lato client con il server
Il processo è il seguente:
un cliente avvia il timer, scrive è
data1
colonna di MySQL in modo che è iniziato il timer, ed una colonnatime1
con l'attuale timestamp (con precisione .01s , dalla chiamata PHP come MySQL non non farlo)l'altro client (polling del server a intervalli 2S) rileva la modifica e avvia un timer, ma sottrae subito (si tratta di un conto alla rovescia) 0.123.dove
ctime
è la data/ora della seconda chiamata client (fornita anche da PHP) etime1
è la data/ora che il primo client ha scritto quando ha avviato il timer.
Questo metodo dovrebbe eliminare il ritardo causato dai 2s intervalli di polling, ma a prescindere se lo fa o no (io non sono davvero sicuro di essere onesti), la sincronizzazione tra i timer varia . A volte sono esatti, a volte possono durare fino a 3 secondi. (E 'inaffidabile.)
Ecco alcuni dei miei relativo codice che sto usando:
var timerRunning, timeRemaining, responseTime;
function restartLocalTimer() {
var d = new Date();
responseTime = d.getTime()/1000;
timerRunning = true;
timerTick();
}
function restartSyncTimer(resp) { // resp is the AJAX response passed
var d = new Date();
responseTime = d.getTime()/1000 - parseFloat(resp["ctime"]) + parseFloat(resp["time"]);
timerRunning = true;
timerTick();
}
function timerTick() {
d = new Date();
timeRemaining = 20 - d.getTime()/1000 + responseTime;
if (timerRunning) setTimeout("timerTick()",25);
}
Tutti i valori di tempo sono in secondi. (A causa del database, potrebbe passare a ms in seguito.)
Le mie domande sono: Ci sono eventuali ritardi (significativi) che non sto tenendo in considerazione? C'è un modo migliore per farlo?
Nota: sono aperto a jQuery (lo utilizzo già per le chiamate AJAX), ma non voglio utilizzare websockets.
Ok, quindi l'ho letto questa volta. Prima di tutto: perché usare 'setTimeout (" timerTick() ", 25)'? Perché no 'setTimeout (timerTick, 25)'. Il primo argomento di 'setTimeout' prende un handle di funzione. In secondo luogo: che cosa succede se utilizzi ad esempio la pagina Timeline o Rete di Google Chrome nella console, ciò ti aiuta a identificare ciò che causa il ritardo, o l'hai già provato? –
ok, la prima cosa è praticamente solo estetica, ma grazie comunque. per quanto riguarda la timeline, ho intenzione di guardare più in quello. –
'resp [" time "]' è il timestamp a cui stai eseguendo il conto alla rovescia? – Bergi