Tôi đang làm việc trên một ứng dụng web rất nhạy cảm với thời gian. Một trong những quy tắc kinh doanh được trao cho tôi là hành vi của ứng dụng phải luôn phụ thuộc vào thời gian trên máy chủ web, bất kể thời gian nào là trên đồng hồ của khách hàng. Để làm rõ điều này với người dùng, tôi được yêu cầu hiển thị thời gian của máy chủ trong ứng dụng web.Hiển thị thời gian của một máy tính khác trên trang web bằng Javascript?
Để kết thúc này, tôi đã viết mã Javascript sau:
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
};
})();
Chức năng thông qua vào cho updateDisplayCallback
là một chức năng đơn giản để hiển thị ngày trên trang web.
Ý tưởng cơ bản là Javascript thực hiện cuộc gọi không đồng bộ để tra cứu thời gian của máy chủ, lưu trữ nó trên máy khách và sau đó cập nhật nó một lần mỗi giây.
Lúc đầu, điều này dường như hoạt động, nhưng khi thời gian trôi qua, thời gian hiển thị sẽ mất sau vài giây mỗi phút. Tôi để nó chạy qua đêm, và khi tôi đến vào sáng hôm sau, nó đã tắt hơn một giờ! Điều này hoàn toàn không được chấp nhận vì ứng dụng web có thể được mở trong nhiều ngày tại một thời điểm.
Làm cách nào để sửa đổi mã này để trình duyệt web liên tục hiển thị chính xác thời gian của máy chủ?
Có thể là một tùy chọn để thực hiện cuộc gọi ajax một lần mỗi phút hoặc lâu hơn, để đồng bộ hóa với máy chủ không? –
lưu ý rằng yêu cầu đến máy chủ cần có thời gian để bạn có thể thêm vài trăm ms mỗi khi bạn thực hiện cuộc gọi. – charlietfl
setInterval KHÔNG CHÍNH XÁC. Tạo sự khác biệt từ thời gian máy chủ và thời gian trên đồng hồ máy tính. Thêm sự khác biệt đó vào đồng hồ của người dùng. Cũng nhớ độ trễ của các cuộc gọi http có thể gây ra thời gian để được giảm giá rất nhiều. Phải mất thời gian để đi du lịch các ống. – epascarello