como escrever um método recursivo em JavaScript usando window.setTimeout ()?

votos
1

Eu estou escrevendo uma classe JavaScript que tem um método que de forma recursiva chama a si mesmo.

Scheduler.prototype.updateTimer = function () {
    document.write( this._currentTime );
    this._currentTime -= 1000;
    // recursively calls itself
    this._updateUITimerHandler = window.setTimeout( arguments.callee , 1000 );
}

Descrição da Propriedade:

_currentTime: the currentTime of the timer in miliseconds.
_updateUITimerHandler: stores the reference so can be used later with clearTimeout().

meu problema é que eu estou usando recursão com setTimeout (). Eu sei que setTimeout () aceitará alguma corda para executar, ou uma referência a uma função. uma vez que esta função é o método de um objeto, eu não sei como chamá-lo de fora. portanto, usado o segundo formato de setTimeout () e passada numa referência ao próprio método. mas não funciona.

Publicado 10/12/2008 em 12:36
fonte usuário
Em outras línguas...                            


3 respostas

votos
9

Tente isto: -

Scheduler.prototype.startTimer = function() {
  var self = this;
  function updateTimer() {
    this._currentTime -= 1000;
    self.hTimer = window.setTimeout(updateTimer, 1000)
    self.tick()
  }
  this.hTimer = window.setTimeout(updateTimer, 1000)
}
Scheduler.prototype.stopTimer = function() {
    if (this.hTimer != null) window.clearTimeout(this.hTimer)
  this.hTimer = null;
}
Scheduler.prototype.tick = function() {
  //Do stuff on timer update
}
Respondeu 10/12/2008 em 12:55
fonte usuário

votos
1

Bem, a primeira coisa a dizer é que, se você está chamando setTimeout, mas não alterar o intervalo, você deve estar usando setInterval.

edição (atualização do comentário): você pode manter uma referência do encerramento se usado como uma classe e setInterval / clearInterval não necessitam de re-referenciação.

edit2: Tem sido apontado que você escreveu calle e que irá trabalhar muito corretamente e 100% de forma inequívoca.

Fora de exaustividade, isso funciona:

function f() 
{
  alert('foo');
  window.setTimeout(arguments.callee,5000);
}

f();

então eu tentei sair document.write vez de alerta e que é o que parece ser o problema. doc.write é repleta de problemas como este por causa de abrir e fechar o DOM para a escrita, então talvez o que você precisa é mudar o innerHTML de seu alvo, em vez de doc.write

Respondeu 10/12/2008 em 12:42
fonte usuário

votos
0

Você poderia manter um ponteiro para ele ...

/* ... */
var func = arguments.callee;
this._updateUITimerHandler = window.setTimeout(function() { func(); }, 1000);
/* ... */
Respondeu 10/12/2008 em 12:55
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more