Is calling setTimeout with a negative delay ok?

前端 未结 4 1000
后悔当初
后悔当初 2021-02-06 20:44

The following snippet sets a timeout that I\'d like to last at least a second:

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


        
相关标签:
4条回答
  • 2021-02-06 21:13

    You could also use a conditional statement, like so:

    if (sleepTime < 0) {
      sleepTime = 0;
    }
    setTimeout(callback, sleepTime);
    
    0 讨论(0)
  • 2021-02-06 21:16

    Better be safe than sorry:

    setTimeout(callback, Math.max(sleepTime, 0))
    
    0 讨论(0)
  • 2021-02-06 21:22

    According to the MDN reference, the specification requires that there is a minimum timeout.

    If you provide something less than this (HTML5 spec says 4ms) then the browser will just ignore your delay and use the minimum.

    So negatives should be fine, since it'll just be less than the minimum.


    Apparently, this isn't always the case (isn't that always the way with web development!). According to ( http://programming.aiham.net/tag/browser-compatibility/ ):

    Providing setTimeout a negative time will not always result in the callback function being called. This works in other browsers, but in Internet Explorer (8 or lower) you have to make sure any negative times are changed to zero.

    I haven't tested this myself, but like Thomasz said, it's probably better to be safe.

    0 讨论(0)
  • 2021-02-06 21:30

    Hmm... The solutions mentioned solves the problem at the call to setTimeout, so it needs to be written each time a call is made. Isn't it better to solve it directly in 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)
    
    0 讨论(0)
提交回复
热议问题