Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 31.01.2010, 02:46
Boris вне форума Посмотреть профиль Отправить личное сообщение для Boris Найти все сообщения от Boris
  № 1  
Ответить с цитированием
Boris

Регистрация: Jan 2010
Сообщений: 19
По умолчанию Про setInterval(funcName, time) подскажите...

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

Итак, имеем такую вот конструкцию:

при некоем триггере происходит эта строчка:
Код AS1/AS2:
intID = setInterval(myFunction, 10000);
 
далее:
function myFunction(){
clearInterval(intID);
function code here...
}
и всё отлично, пока в момент этого интервала(10 сек), триггер не сработает ещё раз.
Как только это происходит - всё, код функции начинает страбатывать каждые 10 сек, независимо не от чего

Я так понимаю, происходит какое-то дублирование intID - но почему, и как с этим бороться ?

Старый 31.01.2010, 03:05
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Вообще-то существует замечательная функция-сестра интервальной - setTimeout, крепко отчего-то всеми игнорируемая, и для которой нет необходимости отключать выполнение явно, так как заданная на исполнение функция выполнится только один раз.

Короче, она идеально подходит для разового отсроченного исполнения:
Код AS1/AS2:
var wait:Number = setTimeout (someFunction, 10000, 'ok!');
 
function someFunction (mess:String) {
  trace (mess); //выведет 'ok!' через 10 сек. 
}
Как видите, можно также передавать параметры исполняемой функции..
Видимо setTimeout - это та же setInterval c автоматической самоочисткой после первого же выполнения целевой функции.
PS. Во, даже парсер AS-кода на форуме с нею не знаком - не подсветил синим... беда прямо..

Теперь по вашей ошибке - возможная и распространенная причина в том, что у вас интенсивно стартовался каждый раз новый интервал, а не один и тот же при сработке триггера! То есть функция не успевала очищать все вновь и вновь стартуемые интервалы.
В этом можно убедится, если сделать trace по его имени - каждый раз номер будет на единицу большим.

Нужно их было делать именными и очищать каждый индивидуально (это не один и тот же интервал), в этом была проблема. Вот смоделирован пример для иллюстрации, в нем стартуется 10 раз вызов целевой функции с трейсом сообщения, делается через интервал.

Код AS1/AS2:
var intHolder:Object = new Object();
var i:Number = 0;
 
this.onEnterFrame = function  () {
	if (i < 10) {
                //задаем переменную типа тumber, как содержимое i-го элемента объекта intHolder, и приравниваем ей очередной интервал:
		intHolder[i] = setInterval (someFunction, 10000, i, 'ok  ' + i); 
                //переменную i передаем в целевую ф-ю, как параметр, чтобы та знала, какой именно экземпляр интервала потом очищать
		i++;
	}
	else {
		delete this.onEnterFrame ;
	}
}
 
function someFunction (num:Number, mess:String) {
  trace (mess); //выведет 'ok' и номер через 10 сек. несколько раз
  clearInterval (intHolder[num]);
}
Но все равно лучше делать через setTimeout в вашем случае, чтобы не ухищряться с очисткой.


Последний раз редактировалось mooncar; 31.01.2010 в 03:33.
Старый 31.01.2010, 13:07
Boris вне форума Посмотреть профиль Отправить личное сообщение для Boris Найти все сообщения от Boris
  № 3  
Ответить с цитированием
Boris

Регистрация: Jan 2010
Сообщений: 19
Супер, читал туториалы и setTimeout фигурировал только в уроках к AS3.
Поверил людям на слово был уверен, что он есть только в АС3 !

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 16:01.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.