setInterval без задержки
Дано:
window.setInterval(function() { // do something }, delay); Необходимо чтобы следующая итерация выполнения функции стартовала сразу же после завершения предыдущей. В некоторых браузерах для этого достаточно указать delay = null;В других же такое значение вызывает ошибку или игнорируется. Функция должна работать асинхронно, поэтому вариант с рекурсией не подходит. Есть какие-нибудь мысли как это реализовать? |
вместо null попробуйте 0, или 1. все равно примерно одинаковый результат ( там везде ~10ms или ~2ms задержка вроде )
|
Сейчас использую значение 0, на первый взгляд все работает, но в IE есть баг с остановкой таймера если функция не успевает отрабатывать быстрее чем запустится следующая итерация.
|
|
Sweet, спасибо за подсказку, но этот способ я попробовал и он меня совершенно не удовлетворил, с ним все только жутко тормозит. Мне не нужна до посинения быстрая "фонилка", смысл в том чтобы функция крутилась строго по кругу и при этом не перекрывалась копиями самой себя.
|
Используй setTimeout с задержкой 1 мс.
setTimeout(function handler(){ var timerID = setTimeout(handler, 1); // do something if(/* something */) clearTimeout(timerID); }, 1);Тогда перекрытия не будет и задержка будет минимальной |
Похоже мы не понимаем друг друга. Предположим у меня большая и очень тяжелая функция, которая выполняется, скажем 10 секунд. Значит если я поставлю ее на выполнение с интервалом в 5 секунд, то будут запускаться ее новые копии еще до того как завершится выполнение предыдущих, таким образом произойдет наложение - одна и та же функция будет выполняться в несколько "потоков", чего я и пытаюсь избежать
Возможно я ошибаюсь и это все предусмотрено на уровне реализации самого браузера, а может быть и нет. |
По этому люди используют setTimeout.
(function(){ if(confirm('Пока функция не выполнится - перезапущена не будет.\nНажмите отмена, чтобы прервать выполнение.')) setTimeout(arguments.callee,1); })() |
Aetae, спасибо, выручил :)
|
o_0
Дак в статье, предложенной Sweet, то же самое. |
Действительно, проморгал.
|
Цитата:
|
Часовой пояс GMT +3, время: 03:57. |