是否使用负延迟调用setTimeout?

rip*_*234 37 javascript settimeout

我有一个代码片段,我想至少持续一秒钟.所以我这样做:

var currentTimeMillis = new Date().getTime();
// do stuff...
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis);
Run Code Online (Sandbox Code Playgroud)

请注意,sleepTime可以是负数.我可不可以做

setTimeout(callback, sleepTime)
Run Code Online (Sandbox Code Playgroud)

或者我必须明确检查负值吗?

Jon*_*ter 49

根据MDN参考,规范要求存在最小超时.

如果你提供的东西少于这个(HTML5规范说4ms),那么浏览器将忽略你的延迟并使用最小值.

所以否定应该没问题,因为它只会低于最低限度.


显然,情况并非总是如此(并不总是与Web开发一样!).根据(http://programming.aiham.net/tag/browser-compatibility/):

提供setTimeout为负时间并不总是会导致调用回调函数.这适用于其他浏览器,但在Internet Explorer(8或更低版本)中,您必须确保任何负面时间都更改为零.

我自己没有测试过,但是像托马斯说的那样,安全起来可能更好.

  • 螺丝IE8.没有超时! (18认同)

Tom*_*icz 42

最好是安全而不是抱歉:

setTimeout(callback, Math.max(sleepTime, 0))
Run Code Online (Sandbox Code Playgroud)

  • 如果性能是一个问题,总是有 `setTimeout(callback,sleepTime>0?sleepTime:0)` (2认同)