Pergunta

Estou tentando chamar um settimeout de dentro de um retorno de chamada SetInterval:

function callback()
{
   //assign myVar
   var myVar = document.getElementById("givenID");
   //...
   //now wait 2 secs then call some code that uses myVAr
   setTimeout("myVar.innerHTML = 'TEST'", 2000);
}

setInterval("callback();", 10000);

O SetInterval funciona conforme o esperado, mas a chamada Settimeout está falhando. Eu acho que o problema está relacionado ao fato de estar referenciando uma variável (Myvar) que não está no escopo.

Qual é a melhor maneira de resolver isso?

Foi útil?

Solução

Este é um candidato perfeito para fechamentos:

setInterval(
    function ()
    {
       var myVar = document.getElementById("givenID");
       setTimeout(
          function()
          {
              // myVar is available because the inner closure 
              // gets the outer closures scope
              myVar.innerHTML = "Junk";
          },2000);
    }, 10000);

Seu problema está relacionado ao escopo, e isso funcionaria em torno disso.

Outras dicas

Eu tive um problema parecido. A questão era que eu estava tentando chamar um método de dentro de si através de um setTimeout (). Algo assim, que não funcionou para mim:

function myObject() {

   this.egoist = function() {
      setTimeout( 'this.egoist()', 200 );
   }

}

myObject001 = new myObject();
myObject001.egoist();

O seguinte também não funcionou:

... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );

A solução foi usar com () declaração como assim:

function myObject() {

   this.egoist = function() {
      with (this) { setTimeout( function() { egoist() }, 200 );}
   }

}

myObject001 = new myObject();
myObject001.egoist();

Claro, este é um ciclo sem fim, mas o ponto que estou destacando aqui é diferente.

Espero que isto ajude :)

Por uma questão de melhor prática, tente não usar strings como parâmetros para setTimeout e setInterval Porque isso vai invocar eval ... Usar o seguinte formulário também pode facilitar o entendimento/depuração:

setInterval(function () {
    // do stuff
    // ...
    // now wait 2 secs then call someFunction
    setTimeout(someFunction, 2000);
}, 10000);

Execute -o no Firefox e verifique as ferramentas | Console de erro. Se o Settimeout falhar, pode dizer por que lá.

Além disso, tente substituir "someFunction();" com "alert('hi')" (sem vírgula) e veja se isso funciona. Nesse caso, o problema é reduzido significativamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top