我有一段代码片段,我希望至少持续一秒钟。所以我这样做:
var currentTimeMillis = new Date().getTime();
// do stuff
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis);
请注意,sleepTime可能是负数。我可以吗
setTimeout(callback, sleepTime)
或者我必须明确检查负值吗?
答案 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)
您可以在此处查看其工作原理:
答案 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)