在分钟变化的时候准确地运行一个函数?

如何在每分钟更改时准确运行一个函数? 如果在每分钟更改时正确触发,则使用setInterval可能会有效。 但是我担心setInterval可能会被长时间运行的事件循环中断,而不会与时钟保持同步。

如何在每分钟更改时精确地运行一个函数?

首先,你应该使用setInterval重复计时器,因为它(试图)保证定期执行,即任何潜在的延迟将不会叠加,因为他们将重复setTimeout调用。 这将每分钟执行一次你的function:

 var ONE_MINUTE = 60 * 1000; function showTime() { console.log(new Date()); } setInterval(showTime, ONE_MINUTE); 

现在,我们需要做的是在准确的时间开始这个:

 function repeatEvery(func, interval) { // Check current time and calculate the delay until next interval var now = new Date(), delay = interval - now % interval; function start() { // Execute function now... func(); // ... and every interval setInterval(func, interval); } // Delay execution until it's an even interval setTimeout(start, delay); } repeatEvery(showTime, ONE_MINUTE); 

您可以尝试尽可能准确地设置每个X毫秒的超时时间,并检查是否已经过去了一分钟,以及自上次调用该函数以来已经过了多less时间,但是就这一点而言。

你不能100%确定你的函数会在1分钟之后触发,因为可能会阻塞事件循环。

如果这是至关重要的,我build议使用一个cronjob或一个单独的Node.js过程专门为此(所以你可以确保事件循环不被阻止)。

资源:

http://www.sitepoint.com/creating-accurate-timers-in-javascript/

这可能是一个想法。 最大偏差应该是1秒。 如果你希望它更精确,可以降低setTimeout 1的毫秒数。

 setTimeout(checkMinutes,1000); function checkMinutes(){ var now = new Date().getMinutes(); if (now > checkMinutes.prevTime){ // do something console.log('nextminute arrived'); } checkMinutes.prevTime = now; setTimeout(checkChange,1000); } 

1但是,也请参阅这个问题 ,关于在JavaScript中超时的准确性

我已经为你提供了一个可能的解决scheme:

 /* Usage: * * coolerInterval( func, interval, triggerOnceEvery); * * - func : the function to trigger * - interval : interval that will adjust itself overtime checking the clock time * - triggerOnceEvery : trigger your function once after X adjustments (default to 1) */ var coolerInterval = function(func, interval, triggerOnceEvery) { var startTime = new Date().getTime(), nextTick = startTime, count = 0; triggerOnceEvery = triggerOnceEvery || 1; var internalInterval = function() { nextTick += interval; count++; if(count == triggerOnceEvery) { func(); count = 0; } setTimeout(internalInterval, nextTick - new Date().getTime()); }; internalInterval(); }; 

以下是每分钟打印一次时间戳的示例用法,但时间漂移每秒调整一次

 coolerInterval(function() { console.log( new Date().getTime() ); }, 1000, 60); 

这不是完美的,但应该足够可靠。 考虑到用户可以切换浏览器上的标签,或者您的代码可能在页面上运行一些其他阻塞任务,所以浏览器解决scheme永远不会是完美的,取决于您(和您的要求)来决定它是否足够可靠或不。

我的第一个想法是使用Date对象来获取当前时间。 这将允许你用一些简单的math来设置你的设置的时间间隔。 然后,由于您担心它下车,每5-10分钟或任何你认为合适的,你可以使用新的date对象重新检查时间,并相应地重新调整你的设置时间间隔。

这只是我的第一个想法,虽然在早上我可以提出一些代码(就像这里凌晨2点)。