Podczas przekazywania dużej wartości w milisekundach do setTimeout()
. Na przykład,
setTimeout(some_callback, Number.MAX_VALUE);
i
setTimeout(some_callback, Infinity);
oba powodują, some_callback
że są uruchamiane niemal natychmiast, jakbym przeszedł 0
zamiast dużej liczby jako opóźnienie.
Dlaczego to się dzieje?
javascript
settimeout
Matt Ball
źródło
źródło
delay >>> 0
dzieje się coś podobnego , więc przekazane opóźnienie wynosi zero. Tak czy inaczej, fakt, że opóźnienie jest przechowywane jako 32-bitowa liczba int bez znaku, wyjaśnia to zachowanie. Dzięki!49999861776383
(49999861776384
powoduje natychmiastowe wywołanie zwrotne)49999861776383 % 2147483648 === 2147483647
Możesz użyć:
źródło
Oto kilka wyjaśnień: http://closure-library.googlecode.com/svn/docs/closure_goog_timer_timer.js.source.html
źródło
setTimeout()
, ale mam nadzieję, że obliczą datę i godzinę, kiedy ma się obudzić i nie zmniejszają licznika na jakimś losowo zdefiniowanym tiku ... (Można mieć nadzieję przynajmniej)Sprawdź dokumentację dotyczącą węzłów na temat timerów tutaj: https://nodejs.org/api/timers.html (zakładając to samo również w js, ponieważ jest to tak wszechobecny termin teraz w pętli zdarzeń
W skrócie:
Gdy opóźnienie jest większe niż 2147483647 lub mniejsze niż 1, opóźnienie zostanie ustawione na 1.
a opóźnienie wynosi:
Liczba milisekund oczekiwania przed wywołaniem wywołania zwrotnego.
Wygląda na to, że zgodnie z tymi regułami wartość limitu czasu jest domyślnie ustawiona na nieoczekiwaną wartość?
źródło
Natknąłem się na to, gdy próbowałem automatycznie wylogować użytkownika z wygasłą sesją. Moim rozwiązaniem było po prostu zresetowanie limitu czasu po jednym dniu i zachowanie funkcji korzystania z clearTimeout.
Oto mały przykład prototypu:
Stosowanie:
I możesz to wyczyścić
stopTimer
metodą:źródło
Nie mogę komentować, ale odpowiedzieć wszystkim ludziom. Pobiera wartość bez znaku (oczywiście nie możesz czekać ujemnych milisekund), więc ponieważ wartość maksymalna to „2147483647”, kiedy wprowadzasz wyższą wartość, zaczyna się od 0.
Zasadniczo opóźnienie = {VALUE}% 2147483647.
Więc użycie opóźnienia 2147483648 sprawiłoby, że 1 milisekunda byłby natychmiastowy.
źródło
w rzeczywistości nie jest liczbą całkowitą. Maksymalna dopuszczalna wartość setTimeout to prawdopodobnie 2 ^ 31 lub 2 ^ 32. Próbować
i otrzymujesz 1 z powrotem zamiast 1,7976931348623157e + 308.
źródło
Number.MAX_VALUE
jest liczbą całkowitą. Jest to liczba całkowita 17976931348623157 z 292 zerami po niej. PrzyczynąparseInt
powrotu1
jest to, że najpierw konwertuje swój argument na łańcuch, a następnie przeszukuje ciąg od lewej do prawej. Gdy tylko znajdzie.
(który nie jest liczbą), zatrzymuje się.Number.isInteger(foo)
. Ale ponieważ nie jest jeszcze obsługiwany, możesz użyćMath.round(foo) === foo
zamiast tego.Number.MAX_VALUE
nie jest liczbą całkowitą, aledouble
. Tak więc ... Podwójna może reprezentować liczbę całkowitą, ponieważ jest używana do zapisywania liczb całkowitych 32-bitowych w JavaScript.Number.MAX_VALUE
to nie jest liczbą całkowitą. Ale jeśli przez „liczbę całkowitą” masz na myśli koncepcję „liczby całkowitej”, to jest to liczba całkowita. W JavaScript, ponieważ wszystkie liczby są 64-bitowymi liczbami zmiennoprzecinkowymi, często używa się mentalnej definicji „liczby całkowitej”.Number.MAX_SAFE_INTEGER
ale nie jest to liczba, której tutaj szukamy.