|
|
|
| Всем привет!
Задача следующая: в каждом цикле итератора нужно вызывать функцию, но не сразу
, а чтобы она начинала выполняться по истечению указанного времени (например, по истечении секунды), первое что мне взбрело в голову - это:
for(var i = 0; i < 10; i++) {
setTimeout('myFunction(i)', 1000);
}
|
казалось бы логичным, но почему-то итератор "не ждёт" пока пройдёт секунда времени и выполнится функция, а переходит сразу же к следующему циклу, в итоге, ни в одной итерации, кроме последней, функция не выполняется, просто не успевает.
Уже 2-й день мучаюсь, по разному пробовал, другие методы, кроме как к зависанию, не приводят...( , помогите пожалуйста решить задачку | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Conta
(24.01.2007 в 22:10)
| | Огромное спасибо Conta!!! Работает, сам бы не додумался заменить итератор рекурсией, спасибо! | |
|
|
|
|
|
|
|
для: Conta
(24.01.2007 в 22:10)
| | Это целая философия: дуализм разрыва и паузы. Поскольку пауза - частный случай разрыва, в JS решили паузу не делать. Разрыв же реализуется через setTimeout. Что менее очевидно и нарушает структурность алгоритма. Но просвещённые должны уметь делать разрывы, как понимать, что такое хлопок одной рукой. | |
|
|
|
|
|
|
|
для: 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);
}
// . . .
}
|
Данный код помог преодалеть неопределённый результат при отображении и скрытии слоёв. У меня до введения "очисти", при вызове отображения слоя, каждый последующий, отображался меньше, чем предыдущий. | |
|
|
|
|
|
|
|
для: retsoul
(24.01.2007 в 23:32)
| | Спасибо за ответ! Результат функции setTimeout() конечно нужно чистить, но в моём случае была нужна задержка, потомучто функция не успевала отрабатывать, как наступала следующая итерация, здесь мне помогла рекурсия, ещё раз спасибо мистеру Conte и всем кто помогал своими ответами! | |
|
|
|