Sto lavorando su un'applicazione web molto sensibile al tempo. Una delle regole aziendali che mi è stata data è che il comportamento dell'applicazione deve sempre dipendere dall'ora sul server Web, indipendentemente dall'ora in cui si trova l'orologio del client. Per rendere questo chiaro all'utente, mi è stato chiesto di mostrare l'ora del server nell'applicazione web.Visualizzazione dell'ora di un altro computer su una pagina Web utilizzando Javascript?
A tal fine, ho scritto il seguente codice JavaScript:
clock = (function() {
var hours, minutes, seconds;
function setupClock(updateDisplayCallback) {
getTimeAsync(getTimeCallback);
function getTimeCallback(p_hours, p_minutes, p_seconds) {
hours = p_hours;
minutes = p_minutes;
seconds = p_seconds;
setInterval(incrementSecondsAndDisplay, 1000);
}
function incrementSecondsAndDisplay() {
seconds++;
if (seconds === 60) {
seconds = 0;
minutes++;
if (minutes === 60) {
minutes = 0;
hours++;
if (hours === 24) {
hours = 0;
}
}
}
updateDisplayCallback(hours, minutes, seconds);
}
}
// a function that makes an AJAX call and invokes callback, passing hours, minutes, and seconds.
function getTimeAsync(callback) {
$.ajax({
type: "POST",
url: "Default.aspx/GetLocalTime",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
var date, serverHours, serverMinutes, serverSeconds;
date = GetDateFromResponse(response);
serverHours = date.getHours();
serverMinutes = date.getMinutes();
serverSeconds = date.getSeconds();
callback(serverHours, serverMinutes, serverSeconds);
}
})
}
return {
setup: setupClock
};
})();
La funzione passata per updateDisplayCallback
è una semplice funzione per visualizzare la data sulla pagina web.
L'idea di base è che il Javascript effettua una chiamata asincrona per cercare il tempo del server, memorizzare sul client, e quindi aggiornarla una volta al secondo.
In un primo momento, questo sembra funzionare, ma col passare del tempo, il tempo visualizzato si mette dietro un paio di secondi ogni minuto. L'ho lasciato in funzione da un giorno all'altro, e quando sono arrivato la mattina dopo, è stato spento per più di un'ora! Questo è del tutto inaccettabile perché l'applicazione web può essere mantenuta aperta per giorni alla volta.
Come posso modificare il codice in modo che il browser visualizzerà continuamente e con precisione l'ora del server?
Sarebbe un'opzione per effettuare la chiamata ajax una volta ogni minuto o così, per la sincronizzazione con il server? –
tieni presente che la richiesta al server richiede tempo, pertanto devi aggiungere diverse centinaia di ms ogni volta che effettui una chiamata. – charlietfl
setInterval NON È ACCURATO. Fai la differenza dal tempo del server e dall'ora sull'orologio del computer. Aggiungi questa differenza all'orologio dell'utente. Ricorda anche che la latenza delle chiamate HTTP può causare un notevole dispendio di tempo. Ci vuole tempo per viaggiare con le valvole. – epascarello