Подтвердить что ты не робот

Вызывает ли setTimeout отрицательную задержку?

Следующий фрагмент устанавливает время ожидания, которое я хотел бы длиться не менее секунды:

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

Обратите внимание, что sleepTime может быть отрицательным числом, безопасно ли звонить setTimeout, например так:

setTimeout(callback, sleepTime)

Или я должен исправить отрицательные значения перед вызовом setTimeout?

4b9b3361

Ответ 1

В соответствии с MDN, спецификация требует, чтобы был минимальный тайм-аут.

Если вы предоставите что-то меньшее, чем это (спецификация HTML5 говорит 4 мс), браузер просто проигнорирует вашу задержку и использует минимум.

Таким образом, негативы должны быть точными, так как это будет меньше минимального.


По-видимому, это не всегда так (не всегда так, как с веб-разработкой!). Согласно (http://programming.aiham.net/tag/browser-compatibility/):

Предоставление setTimeout отрицательного времени не всегда приводит к вызывающая функция вызова. Это работает в других браузерах, но в Internet Explorer (8 или ниже), вы должны убедиться, что любые отрицательные раз меняются на ноль.

Я сам не тестировал это, но, как сказал Томасз, вероятно, лучше быть в безопасности.

Ответ 2

Лучше быть в безопасности, чем сожалеть:

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

Ответ 3

Вы также можете использовать условное выражение, например:

if (sleepTime < 0) {
  sleepTime = 0;
}
setTimeout(callback, sleepTime);

Ответ 5

Хм... Указанные решения решают проблему при вызове 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)