Почему мой setTimeout ускоряется, когда на моем сайте открыто несколько вкладок? - PullRequest
6 голосов
/ 21 июля 2009

У меня есть таймер, который отсчитывает каждую секунду. Он прекрасно работает до тех пор, пока пользователь не откроет 3 или 4 вкладки моего сайта, после чего таймер самой новой вкладки будет удвоен или утроен В настоящее время я могу воспроизвести ошибку только в IE8. Ранее я использовал setInterval и мог также воспроизвести ошибку в Firefox.

Я на самом деле использую FBJS (Javascript от Facebook), поэтому я просто приведу псевдокод.

function countDown() {
  ...
  setTimeout(function() { countDown() }, 1000);    
}

countDown();

Однако то, что я действительно ищу, является более теоретическим. Я знаю, что браузеры могут пытаться играть «догонять» с setInterval, но как несколько вкладок могут вызвать такое поведение для setTimeout?

1 Ответ

5 голосов
/ 21 июля 2009

Вся эта ситуация очень странная. Единственный сценарий, который приходит на ум, где он имеет какой-либо смысл, - это сценарий, в котором браузер пытается «сгладить» период самовосстановления setTimeouts, так же как и для setInterval, и код, который делает это, фактически смешивает таймеры в разных окнах с каждым другой.

Я не знаю, возможно ли это, особенно с участием Facebook, но интересным тестом было бы дать каждому экземпляру случайное имя для функции countDown и посмотреть, имеет ли это какое-то значение, например:

<?php $timerTag = rand(1, 1000); ?>
function countDown<?php echo $timerTag ?>() {
  ...
  setTimeout(function() { countDown<? php echo $timerTag ?>() }, 1000);    
}

countDown<?php echo $timerTag ?>();

Если это изменит наблюдаемое поведение, это аргументирует сценарий, который я имею в виду. (И, возможно, предоставляет способ решения проблемы.)

...