为什么setInterval不能在JavaScript中正确增加我的时钟?
我想显示纽约的实际时间。我有一个html分区:为什么setInterval不能在JavaScript中正确增加我的时钟?,javascript,php,jquery,momentjs,Javascript,Php,Jquery,Momentjs,我想显示纽约的实际时间。我有一个html分区: <div id="time"></div> 它背后的想法是,我想从服务器获取数据,显示在我的网页上,然后每秒递增一次,持续五秒钟,然后再次从服务器获取时间(以保持与服务器上的时间一致)。稍后-继续这样做,获取时间,增加5秒,再次获取时间,等等 它是有效的。。。几乎当网页打开一段时间后,我可以看到实际时间,但它“闪烁”,我可以看到它显示不同的时间-这很难解释,但看起来在该div中已经有一段时间了,新的时间试图每秒钟覆盖一次。
<div id="time"></div>
它背后的想法是,我想从服务器获取数据,显示在我的网页上,然后每秒递增一次,持续五秒钟,然后再次从服务器获取时间(以保持与服务器上的时间一致)。稍后-继续这样做,获取时间,增加5秒,再次获取时间,等等
它是有效的。。。几乎当网页打开一段时间后,我可以看到实际时间,但它“闪烁”,我可以看到它显示不同的时间-这很难解释,但看起来在该div中已经有一段时间了,新的时间试图每秒钟覆盖一次。似乎上一次(此分区的内容)未删除。。。我不知道如何通过调用远程服务器从php获取时间来创建JSFIDLE,因此我只在上面粘贴了以下信息:(
这里可能有什么问题?由于javascript是单线程的,因此setInterval可能在延迟后无法实际运行函数。它会将函数添加到堆栈中,以便在处理器准备就绪后立即运行。如果处理器堆栈中有其他事件,则运行所需的时间将超过间隔时间。多个间隔或tIMEOUT都在向同一堆栈添加调用以进行处理。要解决此问题,您可以使用HTML5 web workers或尝试递归使用setTimeout
这是一本关于网络工作者的好读物:为什么不使用ajax每秒查询服务器以获取时间。这对服务器来说应该很难,因为它只能获取时间。我认为你让思考更难。这听起来是一个好建议,但我不知道如何遵循。你能给我一些例子吗?
<?php
date_default_timezone_set('UTC');
echo time();
?>
var serverTime;
moment.tz.add('America/New_York|EST EDT|50 40|0101|1Lz50 1zb0 Op0');
function fetchTimeFromServer() {
$.ajax({
type: 'GET',
url: 'generalTime.php',
complete: function(resp){
serverTime = resp.responseText;
function updateTimeBasedOnServer(timestamp) { // Take in input the timestamp
var calculatedTime = moment(timestamp).tz("America/New_York");
var dateString = calculatedTime.format('h:mm:ss A');
$('#time').html(dateString + ", ");
};
var timestamp = serverTime*1000;
updateTimeBasedOnServer(timestamp);
setInterval(function () {
timestamp += 1000; // Increment the timestamp at every call.
updateTimeBasedOnServer(timestamp);
}, 1000);
}
})
};
fetchTimeFromServer();
setInterval(function(){
fetchTimeFromServer();
}, 5000);