是否使用负延迟调用setTimeout

Is calling setTimeout with a negative delay ok?

本文关键字:调用 setTimeout 延迟 是否      更新时间:2023-09-26

下面的代码片段设置了一个超时,我希望它至少持续一秒钟:

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

启动过渡 id btn按钮