Ошибка JavaScript clearTimeout в Chrome - PullRequest
0 голосов
/ 30 сентября 2010

У меня на странице идет таймер с интервалом в 10 с.Он создается с помощью setTimeout ("myWork ()", 10000).Работает отлично.В какой-то момент времени, основываясь на некоторых условиях, я очищаю этот интервал и создаю новый, который должен отмечаться с интервалом в 1 с.

var tenSecTimer = 0;

if (myCondition)
{
  clearTimeout(tenSecTimer);
  tenSecTimer = setTimeout("myWork()", 1000);
}

Весь этот процесс прекрасно работает на всех версиях IE и FireFox.Когда я открываю эту страницу в Chrome (6.0), тикер перестает работать после вызова clearTimeout.Он никогда не распознает таймер 1 с.

Что-то, чего мне не хватает для последнего хрома?

Спасибо

Ответы [ 5 ]

1 голос
/ 30 сентября 2010

Почему бы не использовать это?

var tenSecTimer = 0;

if (myCondition) {
    clearTimeout(tenSecTimer);
    tenSecTimer = setTimeout(function () {
        myWork();
    }, 1000);
}

Примечание: он передает функцию, которая затем выполняет функцию myWork. Использование строки для setTimeout или setInterval является плохим, так как она вызывает eval (который работает медленно и имеет другие проблемы).

Источник (прокрутите до конца)

0 голосов
/ 30 сентября 2010

Мне кажется, я решил загадку проблемы. Исходя из комментариев Хана, я понял, что делает настоящий код. У меня есть таймер 1с, который сгенерировал условие для очистки таймера 10с и затем запуска таймера 1с для «myWork». Перед повторным вызовом таймера 1с произошел очередной тик часов. Теперь это очистило таймер, который ожидал вызова myWork. Так что это в значительной степени вошло в бесконечный цикл. Кажется, что таймер Chrome стал слишком эффективным :-) ключом к решению этой проблемы является либо то, что я установил таймер для «myWork» меньше 1 с, либо конечный автомат, который будет следить за тем, чтобы таймер не очищался перед этим. был выполнен.

0 голосов
/ 30 сентября 2010

Не ответ, а полный код с таким же поведением:

(function () {
var counter = 0;

function testCounter() {
  if (counter === 2) {
    clearInterval (timer);
    timer = setInterval (myWork, 1000);
  } 

  else if (counter === 5)
    clearInterval (timer);
}

function myWork () {
  document.body.innerHTML += ++counter + ' ' + Date () +'<br/>';
}

document.body.innerHTML += 'Starting ' + Date () +'<br/>';
var timer = setInterval (myWork, 10000);
setInterval (testCounter, 500);
}) ();

Этот код отображает:

Starting Thu Sep 30 2010 16:15:09 GMT+0200 (CEST)
1 Thu Sep 30 2010 16:15:19 GMT+0200 (CEST)
2 Thu Sep 30 2010 16:15:29 GMT+0200 (CEST)

и не более, если я удаляю setInterval на testCounter и вызываю его внутри myWork, я получаю следующее:

Starting Thu Sep 30 2010 16:20:50 GMT+0200 (CEST)
1 Thu Sep 30 2010 16:21:00 GMT+0200 (CEST)
2 Thu Sep 30 2010 16:21:10 GMT+0200 (CEST)
3 Thu Sep 30 2010 16:21:11 GMT+0200 (CEST)
4 Thu Sep 30 2010 16:21:12 GMT+0200 (CEST)
5 Thu Sep 30 2010 16:21:13 GMT+0200 (CEST)

Очень любопытно .....

0 голосов
/ 30 сентября 2010

Я не уверен, как выглядит остальная часть вашего кода, но вам лучше использовать setInterval() вместо setTimeout(). Шаблон подписи тот же, но setInterval позаботится о повторениях автоматически.

0 голосов
/ 30 сентября 2010

Я сомневаюсь, что это исправит это, но вы пытались передать ссылку вместо строки для оценки?

setTimeout( myWork, 1000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...