Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   как остановить setTimeout? (http://www.flasher.ru/forum/showthread.php?t=133712)

fl4sh 10.12.2009 22:58

как остановить setTimeout?
 
Добрый вечер!
такая проблема:
на сцене есть несколько картинок, через определенное время (с помощью setTimeout) подгружаются другие и заменяют эти..
дело в том, что если во время выполнения setTimeout (а он выполняется практически всё время в цикле) перейти на другой кадр, setTimeout продолжает выполняться :wacko:

пробовал удалять саму функцию -- не помогло, clearTimeout тоже кажется не помогает, да и как к этому timeout'у обратиться, если он вызывается много раз?!

Надеюсь я понятно объяснил (:

veles2008 10.12.2009 23:09

тогда остановить цикл нужно

mooncar 10.12.2009 23:36

У вас несколько timeout'ов, значит очищать нужно все (когда вы в цикле присваиваете id = setTimeut(...), у вас просто некой переменной возвращается очередной номер, а процесс запусается сам по себе, и если так несколько раз, то по этому номеру вы сможете очистить только последний вызванный).
См. http://www.flasher.ru/forum/showthread.php?t=133536, насколько я понимаю, к setTimeout все сказанное также относится.

Т.е. попробуйте именовать timeout'ы индивидуально, то есть присваивать номера каждый раз новой номерной переменной, а потом по этим переменным их очищайте.

veles2008 10.12.2009 23:52

mooncar, Если здесь http://www.flasher.ru/forum/showthread.php?t=133536, setTimeout использовать вместо setInterval то бесконечного выполнения не будет

mooncar 10.12.2009 23:59

Вложений: 1
Автор, вот что я имею ввиду. Пример:
Код AS1/AS2:

//в начале мувики невидимы
for (i = 1; i <= 10; i++) {
        _root['mc' + i]._visible = false ;
}
 
//создаем объект-хранилище для переменных, которые будут содержать номера таймаутов
var indexOfTimeouts:Object = new Object();
 
//стартует показ мувиков с все возрастающей задержкой
startShow.onRelease = function  () {
        for (i = 1; i <= 10; i++) {
                indexOfTimeouts[i] = setTimeout(showMc, i * 500, i); //передаем в функцию аргументом номер i
        }
}
 
//сама функция показа
function showMc (num:MovieClip) {
        _root['mc' + num]._visible = true ;
}
 
//очищает все таймауты, беря номера из переменных, которые содержатся в специальном объекте
sopShow.onRelease = function  () {
        for (i in indexOfTimeouts) {
                clearTimeout(indexOfTimeouts[i]);
        }
};

См. Работающий пример Очистка нескольких таймаутов.rar
То есть рекомендую организовать некое хранилище, наподобие объекта indexOfTimeouts в примере, куда будете складывать номера всех вызванных таймаутов, а к обработчику события перехода на другой кадр (не знаю, что там у вас, нажатие кнопки или что, это неважно) добавить вызов цикла очистки всех таймаутов по номерам, как это сделано в конце кода.

PS. veles2008, разобрались? Да, иногда рациональнее использовать setTimeout, если нужно выполнить что-то только раз. Хотя если делать очистку правильно, то и интервалы все должны очищаться.

fl4sh 11.12.2009 00:23

mooncar
спасибо! то что нужно


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

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