Comportamento estranho de setInterval ()
-
12-09-2019 - |
Pergunta
Eu estou tentando fazer um cálculo muito básico data-diferença com javascript, mas estou recebendo comportamento misto do setInterval ().
Isso atualiza constantemente:
var init = setInterval(function(){
document.getElementById("txt").innerHTML = new Date();
}, 1000);
Mas isso só atualizações uma vez:
var init = setInterval(function(){
var today = new Date();
var started = new Date(); started.setYear(1983);
var difference = today - started;
document.getElementById("txt").innerHTML = difference;
}, 1000);
Eu não entendo. Se eu posso mostrar a data a cada segundo, por que não posso mostrar a diferença de datas a cada segundo?
Solução
Você está redefinindo today
cada vez que a função é chamada, por isso, enquanto as mudanças de tempo, a diferença entre "hoje" e "hoje de 1983" é sempre a mesma.
Mover a atribuição de today
fora do intervalo, por isso só é definido uma vez, trabalhou para mim. Eu vejo o número mudando a cada segundo.
$(function () {
today = new Date();
var x = setInterval(function(){
started = new Date(); started.setYear(1983);
difference = today - started;
document.getElementById("txt").innerHTML = difference;
}, 1000);
});
Outras dicas
Ambos estão executando uma vez a cada 1000 ms (1 por segundo); no entanto o segundo resulta no mesmo valor cada vez, 820540800000. eu suponho que você também perceber que você pode evitar a poluição do espaço de nome global pelo uso criterioso de "var".
Na verdade, ele funciona como esperado. Basta esperar até meia-noite.
Eu acho que você vai encontrá-lo é realmente atualizar constantemente (facilmente visto por apenas colocar um alerta na função), o problema é que o valor é o mesmo todas tempo.
O problema é que você não está definindo a data começou totalmente, apenas o ano. Então você está atualizando segundos minutos e horas cada vez que o executa intervalo daquela data. Para corrigir isso, você deve configurá-lo para um ano específico, mês, dia, hora, minuto, segundo e milissegundo.
Esta é parcialmente trabalhar, se você ficou lá por um ano inteiro você veria a diferença