当计算机进入睡眠状态时,setTimeout会发生什么情况?

在现代networking浏览器中,假设我在10分钟(12:00)进行setTimeout ,5分钟后让电脑进入睡眠状态,系统再次唤醒时会发生什么? 如果在10分钟(12:09)或更晚(16:00)之前醒来,会发生什么?

我问的原因是因为我想要每10分钟申请一个新的身份validation令牌,而且我不确定浏览器是否会做正确的事情,并且在长时间醒来后立即请求新的令牌时间。

澄清 :我不想使用cookie – 我正在尝试在这里build立一个web服务; 是的,服务器将拒绝旧的和无效的令牌。

据我testing,它只是停止,并恢复计算机醒来后。 我想这意味着一个会话取决于setTimeout/Interval计数器从计算机睡着的时候开始计时。

我不认为你应该依赖于setTimeout/Interval的时间关键的东西的准确性。 对于谷歌浏览器,我最近发现 ,任何超时/间隔(即短于1秒)将放慢到每秒一次,如果它启动标签放松焦点。

除此之外,超时/间隔的准确性依赖于其他function的运行等。简而言之:它不是很准确。

因此,使用间隔和超时,检查时间相对于由它启动的函数内的开始时间会给你更好的准确性。 现在,如果你在12:00开始,电脑会在16点13分左右醒来,在16:13点检查你确定你必须更新令牌。 使用时间比较的例子可以在这里find

比较加载页面时的当前date时间和date时间,如下所示:

 //Force refresh after x minutes. var initialTime = new Date(); var checkSessionTimeout = function () { var minutes = Math.abs((initialTime - new Date()) / 1000 / 60); if (minutes > 20) { setInterval(function () { location.href = 'Audit.aspx' }, 5000) } }; setInterval(checkSessionTimeout, 1000); 

该行为基于浏览器和操作系统。 操作系统处理睡眠和个别应用程序往往不考虑它。

最有可能发生的情况是操作系统将在计时器停留的同一时间恢复。 另一种可能是它根本不会开火。

如果真的担心,你可能会希望比对不起更好的安全,并存储一个标记初始化的时间戳,并使用setInterval定期检查(每分钟两次)。

然而,安全不应该只是一个客户端的事情。 确保您的服务器在使用旧/无效令牌时引发错误,并确保Ajax的行为正确。

我同意另一个post,它可能会在下一个打勾时立即触发。 Resig的博客文章非常好。

这是我的代码:

 <!doctype html> <html> <body> <input type="button" name="clickMe" id="colourButton" value="Start Timer" onclick="setTimeout('alert(\'Surprise!\')', 120000)"/> </body> <script> </script> </html> 

我已经采取了三种情况可能回答这个问题。

场景1:在00秒点击“开始计时器”button。 电脑在25秒钟睡着了。 在1分40秒唤醒电脑。 显示2分钟警报。

场景2:在00秒点击“开始计时器”button。 电脑在26秒钟睡着了。 在3分钟后,我唤醒了电脑。 警报显示。

情景3:这真是令人震惊。

 <input type="button" name="clickMe" id="colourButton" value="Start Timer" onclick="setTimeout('alert(\'Surprise!\')', 600000)"/> 

在00秒,我点击“开始计时器”button。 在1分30秒左右,电脑处于hibernate模式(我的电脑需要一分钟才能启动hibernate模式)

8分钟后,我打开笔记本电脑。 在10分钟的时候,popup警报。

 PS: This is my first ever comment on Stack Exchange. I prefer to execute code and view results rather than infer from theory. 

JavaScript定时器(setTimeout)在几种情况下的行为。

  1. 当线程空闲并且超时触发时:超时后立即触发定时器。 它可能有一定的不精确性,约0-5毫秒(典型的情况)。
  2. 当线程超级繁忙(巨大的循环)足够长时间以通过计时器超时:定时器将在线程释放后立即执行。
  3. 当有警报时:与2相同的行为。
  4. 当线程暂停,因为我们的笔记本电脑进入睡眠状态:我已经看到了几件事情。 但最常见的是完全不准确,并忽略了睡眠时间。

由于JavaScript中的计时器基于CPU时钟周期,并且CPU正在hibernate,所以计时器完全暂停并恢复为“因为什么也不会发生”。

基于Ben的回答,我创build了以下util。 你可以调整采样持续时间,但是我使用它就像这样令牌刷新:

 const absoluteSetInterval = (handler, timeout) => { let baseTime = Date.now(); const callHandler = () => { if (Date.now() - baseTime > timeout) { baseTime = Date.now(); handler(); } }; return window.setInterval(callHandler, 1000); }; const absoluteClearInterval = (handle) => window.clearInterval(handle); 

在约翰·雷西格的博客中 ,定时器被称为使用“挂钟”。 我相信事件会在计算机恢复后立即触发,因为setTimeout()不保证执行是特定的时间点,而是在指定的时间间隔之后尽快执行。 不过,我自己也没有检查过。