Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.05.2011, 22:12
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

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

window.setInterval(function() {

  // do something

}, delay);


Необходимо чтобы следующая итерация выполнения функции стартовала сразу же после завершения предыдущей. В некоторых браузерах для этого достаточно указать
delay = null;
В других же такое значение вызывает ошибку или игнорируется. Функция должна работать асинхронно, поэтому вариант с рекурсией не подходит. Есть какие-нибудь мысли как это реализовать?
Ответить с цитированием
  #2 (permalink)  
Старый 29.05.2011, 23:05
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

вместо null попробуйте 0, или 1. все равно примерно одинаковый результат ( там везде ~10ms или ~2ms задержка вроде )
Ответить с цитированием
  #3 (permalink)  
Старый 29.05.2011, 23:12
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Сейчас использую значение 0, на первый взгляд все работает, но в IE есть баг с остановкой таймера если функция не успевает отрабатывать быстрее чем запустится следующая итерация.
Ответить с цитированием
  #4 (permalink)  
Старый 29.05.2011, 23:15
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Очень быстрый setTimeout
Ответить с цитированием
  #5 (permalink)  
Старый 29.05.2011, 23:44
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Sweet, спасибо за подсказку, но этот способ я попробовал и он меня совершенно не удовлетворил, с ним все только жутко тормозит. Мне не нужна до посинения быстрая "фонилка", смысл в том чтобы функция крутилась строго по кругу и при этом не перекрывалась копиями самой себя.
Ответить с цитированием
  #6 (permalink)  
Старый 30.05.2011, 00:29
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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

Последний раз редактировалось Sweet, 30.05.2011 в 00:45.
Ответить с цитированием
  #7 (permalink)  
Старый 30.05.2011, 01:02
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

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

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

Последний раз редактировалось DreamTheater, 30.05.2011 в 01:05.
Ответить с цитированием
  #8 (permalink)  
Старый 30.05.2011, 01:24
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

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

Последний раз редактировалось Aetae, 30.05.2011 в 01:34.
Ответить с цитированием
  #9 (permalink)  
Старый 30.05.2011, 02:01
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Aetae, спасибо, выручил
Ответить с цитированием
  #10 (permalink)  
Старый 30.05.2011, 04:18
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
setTimeout и setInterval срабатывают без задержки! ПОЧЕМУ? shureg Общие вопросы Javascript 1 12.05.2011 09:06
setTimeout setInterval и др. mycoding Общие вопросы Javascript 6 28.10.2010 17:26
Подскажите как в VLC плеере переключать канал без перезагрузки страницы? mff Events/DOM/Window 0 10.05.2010 17:28
Открытие нового окна без скролбаров без верхнего бара "файл правка вид и тп" Mara Общие вопросы Javascript 2 18.02.2010 15:11
Проблема в document.write при использовании setInterval() GOll Общие вопросы Javascript 21 06.10.2008 17:38