【发布时间】:2020-06-15 21:29:04
【问题描述】:
根据我在几个 SO 答案中的理解,如果计算机在调用 setTimeout 后进入睡眠模式,则应忽略睡眠期。
例如:
- t0:
setTimeout(foo, 30000); - t0+20s: 电脑进入睡眠模式
- t0+40s: 电脑退出睡眠模式
- t0+50s:
foo被调用
但是,我的测试显示以下行为:
- t0:
setTimeout(foo, 30000); - t0+20s: 电脑进入睡眠模式
- t0+40s:计算机退出睡眠模式并调用
foo
我的理解是,当计算机唤醒时,如果在休眠期间会触发超时,则立即触发,否则在t0+[超时值]时触发。
那么预期的行为是什么? 所有浏览器和操作系统都一样吗?
我的一个测试(在 Windows 10 上使用最新版本的 Chrome):https://codepen.io/robloche/pen/GRJvEJB
【问题讨论】:
-
setTimeout的一般“定义”是“在给定超时后尽快尽最大努力”。因此,一旦计算机再次唤醒,它就会触发它是有意义的。我不确定规范中是否明确涵盖了这种边缘情况,因此这里的每个实现都可能不同。 -
据我所知,setTimeout 将尝试遵守原始睡眠期,否则它将排队触发。 IOW:如果你设置了 1 分钟的 setTimeout,进入睡眠 30 秒,然后恢复,30 秒后超时将触发,但如果你进入睡眠 2 分钟,超时将在恢复时立即触发。
-
这取决于如果计算机进入睡眠状态,实现用于超时的时钟是否也暂停/睡眠。但是 afaik 所有当前的实现都使用实际时间作为超时使用的时钟的参考,所以你的第二个例子是预期的结果。
My understanding is that when the computer wakes up, if the timeout would have been triggered during the sleep period, it's instantly triggered, otherwise, it's triggered at t0+[timeout value].?:是的 -
@Keith 这就是我观察到的,但它似乎与我在这里读到的不同:stackoverflow.com/questions/6346849/…
-
当然,但是“
30000”基本上是指“在 30 秒内”,而不是“通过每秒减去 1 来倒数到 30”,所以观察到的行为非常有意义。
标签: javascript settimeout sleep-mode