Как написать рекурсивный метод в JavaScript, используя window.setTimeout ()? - PullRequest
1 голос
/ 10 декабря 2008

Я пишу класс JavaSCript, у которого есть метод, который рекурсивно вызывает себя.

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

Описание недвижимости:

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

Моя проблема в том, где я использую рекурсию с setTimeout (). Я знаю, что setTimeout () примет некоторую строку для выполнения или ссылку на функцию. Так как эта функция является методом объекта, я не знаю, как вызвать его извне. поэтому я использовал второй формат setTimeout () и передал ссылку на сам метод. но это не работает.

Ответы [ 3 ]

9 голосов
/ 10 декабря 2008

Попробуйте это: -

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
}
1 голос
/ 10 декабря 2008

Ну, во-первых, стоит сказать, что если вы вызываете setTimeout, но не меняете интервал, вы должны использовать setInterval.

edit (обновление из комментария): вы можете сохранить ссылку из замыкания, если она используется как класс, и setInterval / clearInterval не требует повторной ссылки.

edit2: было отмечено, что вы написали calle e , который будет работать совершенно корректно и однозначно на 100%.

Из полноты, это работает:

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

f();

поэтому я опробовал document.write вместо alert, и именно в этом и заключается проблема. doc.write чреват такими проблемами из-за открытия и закрытия DOM для записи, так что, возможно, вам нужно изменить innerHTML вашей цели, а не doc.write

0 голосов
/ 10 декабря 2008

Вы можете держать указатель на него ...

/* ... */
var func = arguments.callee;
this._updateUITimerHandler = window.setTimeout(function() { func(); }, 1000);
/* ... */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...