Javascript 如何在同一时间内每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); 这很好,但在每个设备上都不一样,比如如果我用这个代码打开页面,我会得到随机数

我要试着正确地解释我的问题。我想每30秒生成一个数字,如下所示:

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进行同步可能是最准确的,但使用初始时间戳可以轻松获得相当准确的结果。