Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Задержка итератора в каждом его цикле, на определённое время
 
 автор: Explicito   (24.01.2007 в 21:20)   письмо автору
 
 

Всем привет!
Задача следующая: в каждом цикле итератора нужно вызывать функцию, но не сразу
, а чтобы она начинала выполняться по истечению указанного времени (например, по истечении секунды), первое что мне взбрело в голову - это:

for(var i = 0; i < 10; i++) {
    setTimeout('myFunction(i)', 1000);
}

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

   
 
 автор: Conta   (24.01.2007 в 22:10)   письмо автору
 
   для: Explicito   (24.01.2007 в 21:20)
 


//вызов функции
START = 0;
END = 10;
myFunction ();
//переменные START и END д.б. глобальными
...

//сама функция
function myFunction () {
if (START == END) return;

//то, что функция делает
...

//в конце функции - увеличение переменной цикла и рекурсия
START++;
setTimeout (myFunction, 1000);
}


Пример см. http://www.softtime.ru/forum/read.php?id_forum=4&id_theme=30395&page=2 , моё сообщение 19.01.2007 в 06:07

   
 
 автор: Explicito   (24.01.2007 в 23:17)   письмо автору
 
   для: Conta   (24.01.2007 в 22:10)
 

Огромное спасибо Conta!!! Работает, сам бы не додумался заменить итератор рекурсией, спасибо!

   
 
 автор: 12345   (24.01.2007 в 23:25)   письмо автору
 
   для: Conta   (24.01.2007 в 22:10)
 

Это целая философия: дуализм разрыва и паузы. Поскольку пауза - частный случай разрыва, в JS решили паузу не делать. Разрыв же реализуется через setTimeout. Что менее очевидно и нарушает структурность алгоритма. Но просвещённые должны уметь делать разрывы, как понимать, что такое хлопок одной рукой.

   
 
 автор: retsoul   (24.01.2007 в 23:32)   письмо автору
 
   для: Explicito   (24.01.2007 в 21:20)
 

Работа с временем в яваскрипте очень примечательная. Возможно не хватает очистки результата от функции setTimeout(), поэтому при каждой итерации получается неопределённый результат.
Можно попробовать создать глобальную переменную и специальную функцию для её очистки, может быть такой вариант поможет:

var nTime = null;
// функция очистки:
function funcClear() {
  window.clearTimeout(nTime);
  }
// функция с многими циклами:
function func() {
// . . .
for(var i = 0; i < 10; i++) {
// сначала чистим
  funcClear();
// потом фызываем задержку
  nTime = window.setTimeout("myFunction(i)", 1000);

// . . .
  }


Данный код помог преодалеть неопределённый результат при отображении и скрытии слоёв. У меня до введения "очисти", при вызове отображения слоя, каждый последующий, отображался меньше, чем предыдущий.

   
 
 автор: Explicito   (25.01.2007 в 12:52)   письмо автору
 
   для: retsoul   (24.01.2007 в 23:32)
 

Спасибо за ответ! Результат функции setTimeout() конечно нужно чистить, но в моём случае была нужна задержка, потомучто функция не успевала отрабатывать, как наступала следующая итерация, здесь мне помогла рекурсия, ещё раз спасибо мистеру Conte и всем кто помогал своими ответами!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования