是否使用负延迟调用setTimeout?

时间:2011-12-08 12:25:55

标签: javascript

我有一段代码片段,我希望至少持续一秒钟。所以我这样做:

var currentTimeMillis = new Date().getTime();
// do stuff
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis);

请注意,sleepTime可能是负数。我可以吗

setTimeout(callback, sleepTime)

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

5 个答案:

答案 0 :(得分:45)

根据MDN引用,规范要求存在最小超时。

如果您提供的内容少于此(HTML5规范说明4毫秒),那么浏览器将忽略您的延迟并使用最小值。

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


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

  

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

我自己没有对此进行测试,但就像托马斯所说的那样,安全起来可能更好。

答案 1 :(得分:39)

比抱歉更安全:

setTimeout(callback, Math.max(sleepTime, 0))

答案 2 :(得分:1)

if(sleepTime < 0)
sleepTime  = 0;

setTimeout(callback, sleepTime) ;

你也可以这样做。

答案 3 :(得分:1)

您可以在此处查看其工作原理:

http://jsfiddle.net/ayezutov/2eZLe/8/

答案 4 :(得分:1)

嗯......所提到的解决方案在调用setTimeout时解决了问题,因此每次调用时都需要写入。{在setTimeout中直接解决它是不是更好?

// Run this once.
(function(){
    var oldSetTimeout = setTimeout
    setTimeout = function(callback, delay){
        return oldSetTimeout(callback, Math.max(delay, 0))
    }
})()

// Call setTimeout safely with a negative delay.
setTimeout(function(){ console.log("Hello World") }, -42)