Будет ли setInterval вызывать зависание браузеров? - PullRequest
3 голосов
/ 30 марта 2011

Пару лет назад меня предупредили против использования setInterval в течение длительных периодов времени, так как это может привести к зависанию браузера, если вызываемая функция будет работать дольше указанного интервала, и затем не сможет ее догнать:

setInterval( function(){
  foo = 'bar_' + i++;
}, 1 );

Теперь я знаю, что добавление большого количества кода в цикле может привести к зависанию браузера в любом случае , и что код блокировки, такой как alert, promptconfirm остановит код в его треках, но есть ли веская причина избегать setInterval?

Примечание: я знаю, как делать рекурсивные setTimeout вызовы (так как это то, что яя пытался выяснить, стоит ли их использовать или можно ли безопасно использовать setInterval.

Ответы [ 2 ]

17 голосов
/ 30 марта 2011

Причина setInterval плоха в том, что он будет пытаться выполнять код каждую X MS независимо от того, что происходит в потоке. Так что если у вас есть:

setInterval( complexFunction, 1 ); // complexFunction takes >1 MS to complete

... вы можете в конечном итоге setInterval попытаться повторно выполнить несколько раз, прежде чем даже его собственный код будет завершен! Однако вы можете использовать setTimeout аналогичным образом и избежать этой проблемы:

setTimeout( complexFunction, 1 );

function complexFunction() {
  // complex code
  setTimeout( complexFunction, 1 );
}

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

0 голосов
/ 30 марта 2011

всегда лучше использовать setTimeout в цикле, чтобы вы точно знали, когда продолжить хронометраж:

foo();
function foo(){

   setTimeout (function(){
      foo = 'bar_' + i++;
      foo();
     }, 1 );

} 

в противном случае, как вы сказали выше, браузер должен будет catch up, и так как цикл ur находится вбесконечно, это не может быть.

...