Eu me deparei com um comportamento inesperado ao passar um grande valor em milissegundos para setTimeout()
. Por exemplo,
setTimeout(some_callback, Number.MAX_VALUE);
e
setTimeout(some_callback, Infinity);
ambos fazem some_callback
com que seja executado quase imediatamente, como se eu tivesse passado em 0
vez de um grande número como o atraso.
Por que isso acontece?
javascript
settimeout
Matt Ball
fonte
fonte
delay >>> 0
acontece, então o atraso passado é zero. De qualquer forma, o fato de o atraso ser armazenado como um int sem sinal de 32 bits explica esse comportamento. Obrigado!49999861776383
(49999861776384
faz com que o retorno de chamada seja49999861776383 % 2147483648 === 2147483647
Você pode usar:
fonte
Algumas explicações aqui: http://closure-library.googlecode.com/svn/docs/closure_goog_timer_timer.js.source.html
fonte
setTimeout()
, mas espero que eles calculem a data e a hora em que ele deve acordar e não decrementem um contador em algum tique definido aleatoriamente ... (Pode-se esperar , pelo menos)Verifique a documentação do nó sobre Timers aqui: https://nodejs.org/api/timers.html (assumindo o mesmo em js, já que é um termo tão onipresente agora baseado em loop de evento
Em resumo:
Quando o atraso for maior que 2147483647 ou menor que 1, o atraso será definido como 1.
e o atraso é:
O número de milissegundos a aguardar antes de chamar o retorno de chamada.
Parece que seu valor de tempo limite está sendo padronizado para um valor inesperado ao longo dessas regras, possivelmente?
fonte
Tropecei nisso quando tentei fazer logout automático de um usuário com uma sessão expirada. Minha solução foi apenas zerar o tempo limite após um dia e manter a funcionalidade para usar o clearTimeout.
Aqui está um pequeno exemplo de protótipo:
Uso:
E você pode limpá-lo com o
stopTimer
método:fonte
Não posso comentar senão responder a todas as pessoas. Leva um valor sem sinal (você não pode esperar milissegundos negativos obviamente) Então, como o valor máximo é "2147483647", quando você insere um valor mais alto, ele começa a partir de 0.
Basicamente, atraso = {VALUE}% 2147483647.
Portanto, usar o atraso de 2147483648 aumentaria 1 milissegundo, portanto, proc instantâneo.
fonte
na verdade não é um número inteiro. O valor máximo permitido para setTimeout é provavelmente 2 ^ 31 ou 2 ^ 32. Experimentar
e você recebe 1 de volta em vez de 1,7976931348623157e + 308.
fonte
Number.MAX_VALUE
é um número inteiro. É o número inteiro 17976931348623157 com 292 zeros depois. O motivo doparseInt
retorno1
é porque ele primeiro converte seu argumento em uma string e, em seguida, pesquisa a string da esquerda para a direita. Assim que encontrar o.
(que não é um número), ele para.Number.isInteger(foo)
. Mas, como ainda não é compatível, você pode usarMath.round(foo) === foo
.Number.MAX_VALUE
não é um inteiro, mas umdouble
. Portanto, é isso ... Um double pode representar um inteiro, pois é usado para salvar inteiros de 32 bits em JavaScript.Number.MAX_VALUE
não é um inteiro. Mas se por "inteiro" você quer dizer o conceito mental de "um inteiro", então é um inteiro. Em JavaScript, como todos os números são de ponto flutuante de 64 bits, é comum usar a definição de conceito mental de "inteiro".Number.MAX_SAFE_INTEGER
mas esse não é o número que estamos procurando aqui.