Какова максимальная задержка для setInterval?

У меня проблемы с Firefox 15 и Chrome 21 со следующим кодом:

setInterval(function () { console.log('test') }, 300000000000)

В обоих браузерах функция запускается сразу же, повторяет очень быстро. Конечно, это большое число (примерно через 10 лет), но я бы не ожидал, что это будет рассматриваться как крошечное или отрицательное число. Я не видел максимально допустимую задержку в любой документации. Кто-нибудь знает, есть ли стандартный макс, или если это просто браузеры смешные?

Ответы

Ответ 1

Я не могу найти документацию на данный момент, но я не удивлюсь, если значение таймера должно было бы соответствовать 32-разрядному значению целого числа.

Ответ 2

Интервал хранится в 32-битном int int (в тестируемой реализации: V8 в Google Chrome), поэтому поведение, которое вы видите, является результатом переполнения интервала до отрицательного числа (в этом случае оно ведет себя как если бы интервал был 0). Таким образом, максимальный интервал, который вы можете использовать, - 2**31 - 1.

Вот как я определил, что это так:

setInterval(function(){console.log("hi");}, Math.pow(2,31));

Ведёт себя как интервал 0.

setInterval(function(){console.log("hi");}, Math.pow(2,31) - 1);

Не срабатывает в то время, когда я был готов ждать.

setInterval(function(){console.log("hi");}, Math.pow(2,33) + 1000);

Ведет себя как интервал 1000 (одна секунда). Здесь 2**33 не влияет на первые 32 бита, поэтому мы получаем только 1000.

Максимально возможный интервал 2**31-1ms немного застенчив 25 дней, поэтому более чем достаточно для чего-то разумного.

Ответ 3

Я думаю, что максимальная задержка составляет 2 31 -1, что составляет 2 147 483 647 мс. Максимальное значение подписанного 32-битного целого числа в мс. Если бы это было без знака, это было бы 2 32 -1 = 4 294 967 295.

Ответ 4

Макс 2,147,483,647 (2 31 -1)

Будьте осторожны, если вы сделаете число больше, чем это, оно запустится немедленно (изображение, на которое вы положили отрицательное значение, поэтому браузер будет работать бесконечно)

setInterval(()=>console.log('n'),2147483647)
31
setInterval(()=>console.log('y'),2147483648)
38
(1588) y