是否使用负延迟调用setTimeout
Is calling setTimeout with a negative delay ok?
下面的代码片段设置了一个超时,我希望它至少持续一秒钟:
var currentTimeMillis = new Date().getTime();
// do stuff...
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis);
如果sleepTime
可以是一个负数,那么像这样调用setTimeout
是否安全:
setTimeout(callback, sleepTime)
或者我需要在调用setTimeout
之前检查负值吗?
根据MDN参考,规范要求存在最小超时
如果你提供的延迟小于这个值(HTML5规范规定为4ms),那么浏览器将忽略你的延迟并使用最小值。
所以负的应该是好的,因为它会小于最小值。
显然,情况并非总是如此(web开发不总是如此吗?)根据(http://programming.aiham.net/tag/browser-compatibility/):
为setTimeout提供一个负时间并不总是会导致正在调用的回调函数。这可以在其他浏览器中工作,但在Internet Explorer(8或更低)你必须确保任何负片时间改为0
我自己还没有测试过,但就像Thomasz说的,安全一点可能更好。
安全胜于后悔:
setTimeout(callback, Math.max(sleepTime, 0))
也可以使用条件语句,如下所示:
if (sleepTime < 0) {
sleepTime = 0;
}
setTimeout(callback, sleepTime);
嗯…上面提到的解决方案在调用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)
是的,像这样以毫秒为单位使用负超时是可以的
setTimeout(() => {
btn.style.top = '16.2%';
btn.style.left = '35.8%';
btn.style.transition = 'all 1.2s ease';
},-1.2*1000);
此代码将在1.2*1000秒延迟后,样式top和样式left
相关文章:
- 调用setTimeout内部的函数时发生引用错误
- 在Dojo类中递归调用setTimeout时是否存在内存泄漏
- 而循环调用setTimeout不起作用
- 在循环中调用 setTimeout 未按预期工作
- 未从单元测试调用 setTimeout
- 使用for循环调用setTimeout
- 我如何在页面加载的第一件事就是调用setTimeout,然后等待五秒钟
- 我如何优化这个调用setTimeout()的递归函数
- 调用setTimeout来减少值
- 在for循环中调用setTimeout()的clearartimeout()
- Dojo: async调用setTimeout + Deferred——>不工作
- 是否使用负延迟调用setTimeout
- 为什么在这种情况下没有调用setTimeOut
- 调用setTimeout是否清除调用栈?
- Backbone model.fetch()回调(调用setTimeout)中的作用域问题
- 递归调用setTimeout函数并传递一个匿名函数
- 从变量调用setTimeout函数
- 调用setTimeOut's函数带有对象,出现意外结果
- 延迟1调用setTimeout的目的是什么
- 在循环中调用 setTimeout 函数