Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   setInterval без задержки (https://javascript.ru/forum/misc/17690-setinterval-bez-zaderzhki.html)

DreamTheater 29.05.2011 22:12

setInterval без задержки
 
Дано:

window.setInterval(function() {

  // do something

}, delay);


Необходимо чтобы следующая итерация выполнения функции стартовала сразу же после завершения предыдущей. В некоторых браузерах для этого достаточно указать
delay = null;
В других же такое значение вызывает ошибку или игнорируется. Функция должна работать асинхронно, поэтому вариант с рекурсией не подходит. Есть какие-нибудь мысли как это реализовать?

melky 29.05.2011 23:05

вместо null попробуйте 0, или 1. все равно примерно одинаковый результат ( там везде ~10ms или ~2ms задержка вроде )

DreamTheater 29.05.2011 23:12

Сейчас использую значение 0, на первый взгляд все работает, но в IE есть баг с остановкой таймера если функция не успевает отрабатывать быстрее чем запустится следующая итерация.

Sweet 29.05.2011 23:15

Очень быстрый setTimeout

DreamTheater 29.05.2011 23:44

Sweet, спасибо за подсказку, но этот способ я попробовал и он меня совершенно не удовлетворил, с ним все только жутко тормозит. Мне не нужна до посинения быстрая "фонилка", смысл в том чтобы функция крутилась строго по кругу и при этом не перекрывалась копиями самой себя.

Sweet 30.05.2011 00:29

Используй setTimeout с задержкой 1 мс.
setTimeout(function handler(){
  var timerID = setTimeout(handler, 1);
  // do something
  if(/* something */) clearTimeout(timerID);
}, 1);
Тогда перекрытия не будет и задержка будет минимальной

DreamTheater 30.05.2011 01:02

Похоже мы не понимаем друг друга. Предположим у меня большая и очень тяжелая функция, которая выполняется, скажем 10 секунд. Значит если я поставлю ее на выполнение с интервалом в 5 секунд, то будут запускаться ее новые копии еще до того как завершится выполнение предыдущих, таким образом произойдет наложение - одна и та же функция будет выполняться в несколько "потоков", чего я и пытаюсь избежать

Возможно я ошибаюсь и это все предусмотрено на уровне реализации самого браузера, а может быть и нет.

Aetae 30.05.2011 01:24

По этому люди используют setTimeout.
(function(){
if(confirm('Пока функция не выполнится - перезапущена не будет.\nНажмите отмена, чтобы прервать выполнение.')) setTimeout(arguments.callee,1);
})()

DreamTheater 30.05.2011 02:01

Aetae, спасибо, выручил :)

FINoM 30.05.2011 04:18

o_0
Дак в статье, предложенной Sweet, то же самое.


Часовой пояс GMT +3, время: 04:17.