私は非常に時間に敏感な Web アプリケーションに取り組んでいます。私に与えられたビジネス ルールの 1 つは、クライアントの時計の時刻に関係なく、アプリケーションの動作は常に Web サーバーの時刻に依存する必要があるというものです。これをユーザーにわかりやすくするために、Web アプリケーションでサーバーの時刻を表示するように依頼されました。
この目的のために、次の 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
};
})();
for に渡される関数updateDisplayCallback
は、Web ページに日付を表示する単純な関数です。
基本的な考え方は、Javascript が非同期呼び出しを行ってサーバーの時間を検索し、それをクライアントに保存してから、1 秒に 1 回更新するというものです。
最初はこれが機能しているように見えますが、時間が経つにつれて、表示される時間が毎分数秒遅れます。私はそれを一晩中動かしたままにし、翌朝に戻ったとき、それは1時間以上ずれていました! Web アプリケーションは一度に何日も開いたままになる可能性があるため、これはまったく受け入れられません。
Web ブラウザがサーバーの時刻を継続的かつ正確に表示するように、このコードを変更するにはどうすればよいですか?