Я столкнулся с неожиданным поведением при передаче большого значения миллисекунды в setTimeout()
. Например,
setTimeout(some_callback, Number.MAX_VALUE);
и
setTimeout(some_callback, Infinity);
оба заставляют some_callback
запускаться почти сразу, как если бы я пропустил 0
вместо большого числа в качестве задержки.
Почему это происходит?
javascript
settimeout
Мэтт Болл
источник
источник
delay >>> 0
происходит что-то вроде этого , поэтому пройденная задержка равна нулю. В любом случае, это поведение объясняется тем фактом, что задержка хранится как 32-битное целое число без знака. Спасибо!49999861776383
(49999861776384
вызывает мгновенное49999861776383 % 2147483648 === 2147483647
Ты можешь использовать:
источник
Некоторое объяснение здесь: http://closure-library.googlecode.com/svn/docs/closure_goog_timer_timer.js.source.html
источник
setTimeout()
, но я надеюсь, что они вычисляют дату и время, когда он должен проснуться, и не уменьшают счетчик на каком-то случайно заданном тике ... (Можно надеяться , по крайней мере)Ознакомьтесь с документацией узла по таймерам здесь: https://nodejs.org/api/timers.html (предполагается, что то же самое и для js, поскольку теперь это такой повсеместный термин в цикле событий, основанном на
Коротко:
Если задержка больше 2147483647 или меньше 1, задержка будет установлена на 1.
и задержка:
Количество миллисекунд ожидания перед вызовом обратного вызова.
Похоже, что для вашего тайм-аута по умолчанию установлено неожиданное значение в соответствии с этими правилами, возможно?
источник
Я наткнулся на это, когда попытался автоматически выйти из системы пользователя с истекшим сеансом. Мое решение заключалось в том, чтобы просто сбросить тайм-аут через один день и сохранить функциональность для использования clearTimeout.
Вот небольшой пример прототипа:
Использование:
И вы можете очистить это с помощью
stopTimer
метода:источник
Не могу комментировать, но отвечать всем людям. Он принимает беззнаковое значение (очевидно, вы не можете ждать отрицательные миллисекунды). Так как максимальное значение равно «2147483647», когда вы вводите более высокое значение, оно начинается с 0.
Обычно задержка = {VALUE}% 2147483647.
Таким образом, использование задержки 2147483648 сделает его 1 миллисекундой, следовательно, мгновенный процесс.
источник
на самом деле не целое число. Максимально допустимое значение для setTimeout, скорее всего, 2 ^ 31 или 2 ^ 32. Пытаться
и вы получите 1 обратно вместо 1,7976931348623157e + 308.
источник
Number.MAX_VALUE
это целое число. Это целое число 17976931348623157 с 292 нулями после. ПричинаparseInt
возврата в1
том, что он сначала преобразует свой аргумент в строку, а затем выполняет поиск в строке слева направо. Как только он находит.
(а это не число), он останавливается.Number.isInteger(foo)
. Но поскольку он еще не поддерживается, вы можете использоватьMath.round(foo) === foo
вместо него.Number.MAX_VALUE
не целое число, аdouble
. Итак, вот что ... Двойное число может представлять целое число, поскольку оно используется для сохранения 32-битных целых чисел в JavaScript.Number.MAX_VALUE
это не целое число. Но если под «целым числом» вы подразумеваете мысленное понятие «целое число», то это целое число. В JavaScript, поскольку все числа представляют собой 64-битные числа с плавающей запятой, обычно используется ментальное определение понятия «целое число».Number.MAX_SAFE_INTEGER
но это не тот номер, который мы здесь ищем.