Вызывает ли setTimeout отрицательную задержку?
Следующий фрагмент устанавливает время ожидания, которое я хотел бы длиться не менее секунды:
var currentTimeMillis = new Date().getTime();
// do stuff...
var sleepTime = 1000 - (new Date().getTime() - currentTimeMillis);
Обратите внимание, что sleepTime может быть отрицательным числом, безопасно ли звонить setTimeout
, например так:
setTimeout(callback, sleepTime)
Или я должен исправить отрицательные значения перед вызовом setTimeout
?
Ответы
Ответ 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);
Ответ 4
Вы можете проверить, как он работает здесь:
http://jsfiddle.net/ayezutov/2eZLe/8/
Ответ 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)