Если у меня есть следующий код:

var myfunc = function() { alert('wow'); };
var t=setTimeout(myfunc, 300);

Могу ли я что-нибудь сделать с идентификатором, хранящимся в t, чтобы проверить продолжительность таймера и обратный вызов? Я пытаюсь напрямую проверить свойства таймера, поэтому мне не нужно запускать его до истечения времени ожидания в модульных тестах.

0
Dane O'Connor 12 Авг 2010 в 19:42

2 ответа

Лучший ответ

Нет, это невозможно.

Вместо этого вы можете отслеживать их по-другому, примерно так:

var timeouts = [{
  fn: myfunc,
  timeout: 300
}];

for(var i = 0; i < timeouts.length; i++){
  timeouts[i].id = window.setTimeout(timeouts[i].fn, timeouts[i].timeout);
}
1
jvenema 12 Авг 2010 в 15:50

Возвращаемый идентификатор является внутренним для браузера, поэтому вы мало что можете с ним поделать. Но поскольку вы знаете продолжительность и обратный вызов, когда запускаете таймер, вы могли бы просто обернуть все это в класс Timer, который делает все за вас:

function Timer(callback, timeout) {
  this.callback = callback;
  this.timeout = timeout;
  this.id = window.setTimeout(callback, timeout);
}

Timer.prototype.cancel = function() {
  window.clearTimeout(this.id);
}

Timer.prototype.fire = function() {
  this.cancel();
  this.callback();
}

Затем вы просто создаете таймеры и получаете доступ к их свойствам следующим образом:

t = new Timer(myfunc, 300);
alert(t.timeout);
0
casablanca 12 Авг 2010 в 16:01