Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Método clearInterval

Oi gente,

Poderiam me explicar um pouquinho melhor esse trecho do código, mais sobre o método clearInterval e o contexto usado, além de ter que "setar" a variável intervaoId para null novamente?

function zerar() {
    clearInterval(intervaloId);
    intervaloId = null;
}

Eu sinto que entendi, mas ao mesmo tempo fiquei meio confuso em como ele funciona.

Obrigado!

:)

4 respostas
solução!

Eu também não entendi o por quê de redefinir o cronômetro pra null. Mas pelo que entendi das minhas pesquisas nas documentações aí pela internet:

Quando a gente define o intervaloID = setInterval(func, time), a função setInterval retorna o id do intervalo, não o intervalo em si. E a clearInterval vai lá e termina o intervalo com aquele id que foi passado pra ela. Mas acontece que tem uma outra função chamada setTimeout(func, time). Enquanto a setInterval executa func continuamente a cada intervalo de tempo time, a setTimeout executa a func somente uma vez quando depois de um intervalo de tempo time.

O problema parece estar no fato dessas duas funções terem o mesmo conjunto de ids possíveis. Então, podedmos ter problemas caso estejamos lidando com multiplos intervalos e timeOuts.

Imaginemos que nós criamos um Timeout. timeoutID = setTimeout(func1, 1000). Depois de 1seg esse Timeout é executado. Nós finalizamos ele com clearTimeout(timeoutID), mas n'ao limpamos a variável timeoutID. Mas pra frente, a gente cria um interval com intervaloID = setInterval(func, time). Mas como elas compartilham o mesmo conjunto de possíveis IDs, agora o timeoutID tem o ID do intervalo e isso pode gerar problemas . Então parece que é uma boa prática zerar o ID quando acabar com o intervalo ou timeout.

Mas ainda tem algumas pessoas que podem argumentar que isso não é bom porque você tá mudando o tipo de uma variável que antes era número pra null, que é um objeto. Mas eu não tenho experiência pra argumentar :v

Por favor, algum tutor pode completar e me corrigir :)

Links: https://stackoverflow.com/questions/40869259/is-it-necessary-to-set-the-id-of-setinterval-variable-to-null-after-clearinterva

https://developer.mozilla.org/en-US/docs/Web/API/setInterval

https://developer.mozilla.org/en-US/docs/Web/API/clearInterval

https://developer.mozilla.org/en-US/docs/Web/API/setTimeout

https://developer.mozilla.org/en-US/docs/Web/API/clearTimeout

Olá, Mayk!

Entendi sua explicação e realmente faz total sentido com tudo que você disse. Agradeço por compartilhar o que você conseguiu achar.

Só não irei marcar sua resposta como solução, pois, assim como você disse, vou ver se algum tutor tem algo a mais para complementar aqui.

Valeu de novo :)

É importante limpar esta variável pois utilizamos a existência de um valor associado à ela como condicional em outra parte do código:

function iniciar() {
  \\verifica se a variável "intervaloID" possui algum valor guardado nela --> \\ if (intervaloID) {
    zerar();
    return;
  }
  intervaloID = setInterval(contagemRegressiva, 1000);
}

Em outras palavras, a função "zerar()" só é iniciada se a variável intervaloID não for null. Portanto, se não a limparmos na função "zerar()", ela continuará tendo um valor, e a função "iniciar()" não seria capaz de retomar o temporizador, pois estaria presa ao código executado na condicional "if()".

É importante mencionar que a função "clearInterval()" não limpa a variável, apenas impede a execução do código que está dentro dela.

Valeu pela explicação, Nicolas!