Pergunta

O navegador acompanha o ativo setInterval e setTimeout IDs? Ou isso é apenas o desenvolvedor para acompanhar?

Se ele acompanhar deles, é acessível através do nascimento?

Foi útil?

Solução

Está pronto para o desenvolvedor acompanhar. Você pode fazer isso usando o valor retornado da função SetTimeout/SetInterval e passando esse valor para a função ClearTimeout/ClearInterval - conforme descrito em outras respostas aqui.

Isso parece ser porque cada navegador implementará o acompanhamento dos intervalos à sua maneira.

De w3.org/tr/2009/wd-html5-20090212/no.html (um rascunho, mas w3schools e http://w3.org/tr/window Explique quase da mesma maneira) - Settimeout e SetInterval retornam um longo e limpo e clearInterval aceita um longo para encontrar e cancelar

Outras dicas

Você pode adicionar esses rastreamentos globais de temporizadores, substituindo o setTimeout/seInterval funções. Como um bônus, você adiciona código facilmente quando um cronômetro estiver definido ou estourado, rastreie temporizadores ao vivo ou temporizadores estourados, etc ...

Por exemplo:

timers = {}; // pending timers will be in this variable
originalSetTimeout = window.setTimeout;
// override `setTimeout` with a function that keeps track of all timers
window.setTimeout = function(fu, t) {
    var id = originalSetTimeout(function() {
        console.log(id+" has timed out");
        delete timers[id]; // do not track popped timers 
        fu();
    }, t);
    // track this timer in the `timers` variable
    timers[id] = {id:id,  setAt: new Date(),  timeout: t};
    console.log(id+" has been set to pop in "+t+"ms");
}
// from this point onward all uses of setTimeout will be tracked, logged to console and pending timers will be kept in the global variable "timers".

Isso pode lhe interessar, se você está curioso sobre como o timer é 'lembrado' por sua janela.

<!doctype html> 
<html lang= "en"> 
<head> 
<meta charset= "utf-8"> 
<title>Timer </title> 
</head> 
<body>
<h1>Timers</h1>
<script>

if(!window.timers){
    var timers= [], i= 0;
    while(i<5){
        timers.push(setInterval(function(){
            if(confirm(timers.join('\n')+'\nRemove a timer?')){
                clearInterval(timers.shift());
            }
        },
        i*1000+1000));
        ++i;
    }
}
</script>

</body> 
</html> 

Atualizar:

Existem 2 aspectos nesta questão.

  1. O navegador acompanha os IDs do timer?
  2. Eles estão acessíveis

Só posso presumir o número 1 (e mais tarde #2) que o OP significa "eles são rastreados" no sentido geral, porque, como desenvolvedor, ele gostaria de controlar sobre eles.

Em resumo, sim, eles são rastreados (como @s_hewitt observou, como long valores pelo navegador) e eles podem ser gerenciados pelo desenvolvedor, mantendo uma referência aos temporizadores ao configurar.

Como desenvolvedor, você pode controlar (por exemplo, pare) ligando (ClearInterval (Handleref), ou ClearTimeout (Handleref))

No entanto, não há nenhum padrão window.timers Ou coleção semelhante que oferece uma lista dos temporizadores existentes - você precisará manter isso se achar que precisa.

function startPolling(delay){
  pollHandle = setInterval(doThis, delay);
}
function stopPolling(){
  clearInterval(pollHandle);
}

function doThisIn30minUnlessStopped(){
  timerHandle = setTimeout(doThisThing, 1800000);
}
function stop30minTimer(){
  clearTimeout(timerHandle);
}    

Você simplesmente precisa criar uma referência variável ao seu timer e, se/quando necessário, limpe -o pelo nome.

Quando você carrega outra página, todos os temporizadores são automaticamente limpos pelo navegador, para que você não precise manter uma alça e limpá -los, a menos que precise/deseje.

Veja os scripts abaixo, o navegador pode se lembrar do ID de cada iteração do Settimeout

for (i = 1; i <= d; i++) {
          (function(j) {
                var delay = j/d; 
               t[j] = setTimeout(function() {      
                      elem.style.top = j+"px";
                     },delay);

            })(i);           
 } 

Você pode acessá -los por

for (i in t) {
      alert(t[i]);  
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top