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

Sud*_*han 59 javascript settimeout

在现代网络浏览器中,假设我做了setTimeout10分钟(在12:00),5分钟后让计算机进入睡眠状态,当系统再次唤醒时会发生什么?如果它在10分钟之前(12:09)或之后(16:00)醒来会发生什么?

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

澄清:我不想使用cookies - 我正在尝试在这里建立一个Web服务; 是的,服务器将拒绝旧的和无效的令牌.

Koo*_*Inc 47

据我测试,它只是停止并在计算机唤醒后恢复.我想这意味着一个会话取决于setTimeout/Interval计算机睡着时的计数器滴答.

我不认为你应该依赖setTimeout/Interval时间关键的东西的准确性.对于谷歌浏览器我最近发现任何超时/间隔(短于1秒)将减慢到每秒一次,如果激活它的选项卡失去焦点.

除此之外,超时/间隔的准确性取决于其他运行的功能等.简而言之:它不是很准确.

因此,使用间隔和超时,检查由它启动的函数内的开始时间的时间将提供更好的准确性.现在,如果你从12:00开始,计算机将进入睡眠状态并在16:13左右醒来,检查16:13对抗12:00您确定必须更新令牌.可以在此处找到使用时间比较的示例

  • 我认为这可以表述得更清楚:当计算机唤醒时,setInterval/setTimeout 不知道任何时间已经过去。 (8认同)

Dan*_*Boi 8

这是我的代码:

<!doctype html>
<html>

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

</body>
<script>


</script>
</html>
Run Code Online (Sandbox Code Playgroud)

我已经采取了三个可能回答这个问题的场景。

场景 1:在 00 秒时单击“启动计时器”按钮。计算机在 25 秒时进入睡眠状态。在 1 分 40 秒唤醒计算机。在 2 分钟时显示警报。

场景 2:在 00 秒时单击“启动计时器”按钮。在 26 秒时,计算机进入睡眠状态。3 分钟后,我唤醒了电脑。显示警报。

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

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

在 00 秒时,我单击“启动计时器”按钮。在大约 1 分 30 秒时,计算机处于休眠模式(我的电脑需要一分钟才能启动休眠)

8 分钟后,我打开笔记本电脑。恰好在 10 分钟时,警报弹出。

PS: This is my first ever comment on Stack Exchange. I prefer to execute code and view results rather than infer from theory.
Run Code Online (Sandbox Code Playgroud)


小智 6

将当前日期时间与页面加载时的日期时间进行比较,如下所示:

//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);
Run Code Online (Sandbox Code Playgroud)

  • 内部setInterval()的原因是什么?为什么是5秒? (2认同)

And*_*oso 5

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

最有可能发生的是操作系统将在计时器上的剩余时间与关闭时相同的时间恢复。另一种可能性是它根本不会触发。

如果这真的是一个问题,您可能希望比抱歉更安全,并存储令牌初始化时间的时间戳并用于setInterval定期检查(例如每分钟两次)。

然而,安全不应该只是客户端的事情。如果使用旧的/无效的令牌,请确保您的服务器抛出错误,并且 Ajax 的响应行为正确。

[编辑] 我同意另一篇文章,它可能会在下一个滴答声中立即触发。Resig 的博文非常好。


Jos*_*abo 5

JavaScript 计时器 (setTimeout) 在多种情况下的行为。

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

由于 JavaScript 中的计时器基于 CPU 滴答,并且 CPU 处于睡眠状态,因此计时器会完全暂停并恢复为“因为不会发生任何事情”。


Ere*_*hen 5

根据 Ben 的回答,我创建了以下实用程序。您可以调整采样持续时间,但是我像这样使用它来刷新令牌:

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);
Run Code Online (Sandbox Code Playgroud)