Javascript 如何在同一时间内每30秒在每个设备上调用一次函数?
我要试着正确地解释我的问题。我想每30秒生成一个数字,如下所示:Javascript 如何在同一时间内每30秒在每个设备上调用一次函数?,javascript,jquery,Javascript,Jquery,我要试着正确地解释我的问题。我想每30秒生成一个数字,如下所示: function getRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } setTimeout(function(){ getRandomNumber(0,14); }, 30000); 这很好,但在每个设备上都不一样,比如如果我用这个代码打开页面,我会得到随机数
function getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
setTimeout(function(){
getRandomNumber(0,14);
}, 30000);
这很好,但在每个设备上都不一样,比如如果我用这个代码打开页面,我会得到随机数,但是如果我的朋友在我打开页面后5秒后打开它,就会出现延迟。有没有办法解决这个问题?我认为像获得时间服务器并按照他的方式来做这样的事情可以奏效,但我不知道如何去做。这个问题没有完美的解决方案,这里有两个选项:
一个简单的和一个复杂的应该更精确
如果您在所有设备上都有相同的时间*您可以在第一次调用时使用
new Date().getTime()%30000
,这样它们都处于同步状态,然后在超时时始终使用常量30000
function getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
setTimeout(function() {
getRandomNumber(0, 14);
}, new Date().getTime() % 30000); // first time use this
*时区无关紧要,但一分钟的秒数
另一种方法是让服务器通过他的时间,然后猜测延迟来更正加载时间,并使用
new Date().getTime()
最简单的解决方案之一是创建一个新的Date
对象,用getSeconds
读取秒数,然后将其四舍五入为30的倍数,并使用setTimeout
将生成器安排到下一步。一旦启动,您可以决定使用相同的功能再次调度,或者使用setInterval
设置间隔
如果你不想依赖本地时钟,我想你必须使用像ntp这样的服务,但它要求你知道时间的增量等等。你可以用一行PHP来实现这一点 这在这里起作用
<script>
function getRandomNumber(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
// The variable 'startTime' is synchronized with the server
var startTime=parseInt(<?php echo date("now")?>);
setInterval(function() {
startTime++;
if(startTime%30==0) document.write(parseInt(getRandomNumber(0, 14)).toString()+"<br>");
}, 1000);
</script>
函数getRandomNumber(最小值、最大值){
返回Math.floor(Math.random()*(max-min+1))+min;
}
//变量“startTime”与服务器同步
var startTime=parseInt();
setInterval(函数(){
startTime++;
if(startTime%30==0)document.write(parseInt(getRandomNumber(0,14)).toString()+“
”;
}, 1000);
请注意,我使用了setInterval而不是setTimeout,因此它将重复。谢谢,我将尝试它!这是一个巨大的假设,即使如此,JS计时器的准确性也不是很可靠。@CodeiSir,这只是为了强调它;)事实上,唯一的其他方法是让服务器通过一段时间,然后猜测延迟来纠正它,然后使用它time@NinaScholz是的,谢谢-我在答疑网中强调了这一点,在这种情况下,长轮询或任何其他全向服务器-客户端通信技术通常都是合适的——请记住,您有一个服务器设置,这是一个很难解决的问题。假设所有客户机上的时间设置正确且同步,这是一个巨大的假设,而且很可能会以糟糕的结局告终。我建议颠倒这个过程,从服务器向所有客户端发出通知,这样唯一可能的区别就是网络延迟。要做到这一点,请使用WebSocket。您可以根据系统时钟设置第一次超时,以便在接下来的30秒发生。如果同步必须尽可能精确,您应该从服务器获取时间。例如,服务器可以通过将其打印为json并将其放置到html中的js变量或作为html数据属性,将毫秒传递到下一个甚至30秒。通过websockets进行同步可能是最准确的,但使用初始时间戳可以轻松获得相当准确的结果。