Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Выполнение через определённое время (http://www.flasher.ru/forum/showthread.php?t=172335)

JOGER 07.12.2011 04:47

Выполнение через определённое время
 
Уважаемые форумчане, подскажите как выполнить действие через определённое время?
пробовал setInterval, но действие у меня повторяется каждые n cекунд, а нужно однократное выполнение.

В частности, хочу сделать переход на ссылку через 10 секунд, как это оформить на AS3? ниже мой код. Переход на localhost происходит через каждые 5 секунд, а нужно один раз..
Код AS3:

stop();
var delay:Number = 5000;
var id:uint = setInterval(goNext, delay);
 
function goNext():void
{
        mc.gotoAndStop(2);
        navigateToURL( new URLRequest( "http://localhost/" ), "_blank" );
}


fish_r 07.12.2011 04:58

setInterval Возвращает uint — Уникальный числовой идентификатор отложенного процесса. Используйте этот идентификатор для отмены процесса, вызвав метод clearInterval().

А вообще рекомендуется пользоваться классом Timer. Там, кстати, вызов с явным аргументом опр. кол-во срабатываний.

ChuwY 07.12.2011 09:53

Для однократного исполнения можно воспользоваться setTimeout

fish_r 07.12.2011 10:55

Цитата:

Сообщение от ChuwY (Сообщение 1050166)
Для однократного исполнения можно воспользоваться setTimeout

сейчас не вспомню, но где-то читал что не рекомендуется пользоваться ни setInterval, ни setTimeout,
то ли они сделаны просто для соблюдения ECMA, то ли оставлены как атавизм прошлых версий,
то ли просто не надежны, что то такое ) В общем почему не помню, но не пользуюсь этими штуками )

Bgg 07.12.2011 11:26

Цитата:

Сообщение от fish_r (Сообщение 1050169)
сейчас не вспомню, но где-то читал что не рекомендуется пользоваться ни setInterval, ни setTimeout

В документации.

alatar 07.12.2011 11:27

Цитата:

но где-то читал что не рекомендуется пользоваться ни setInterval, ни setTimeout
Где-то
Цитата:

Вместо использования метода setInterval() рекомендуется создавать объект Timer с заданным интервалом, в котором в качестве параметра repeatCount используется значение 0 (то есть таймер выполняется бесконечно).
Цитата:

Вместо использования этого метода рекомендуется создавать объект Timer с указанным интервалом, в котором в качестве параметра repeatCount используется значение 1 (то есть таймер запускается один раз).

ChuwY 07.12.2011 11:50

А почему не рекомендуется никто не объяснит?
Слышал только весьма расплывчатые рассуждения.

gloomyBrain 07.12.2011 11:54

Ну, насколько я помню, обе функции являются обертками вокруг обычного Timer. Зачем мне обертка, если я могу использовать сам Timer?
И второе - что таймер каждый раз создается заново (на каждый вызов setTimeout или setInterval) - а это плохо с точки зрения потребляемых ресурсов

incvizitor 07.12.2011 12:13

Ну как вариант, вместо setTimeout, можно свою обвертку с пулом таймеров написать.

Srednas 07.12.2011 12:36

Можно запустить таймер на 10 секунд, а при срабатывании удалить слушатель.

Еще такая штука есть, может пригодиться.

Inet_PC 07.12.2011 12:48

Цитата:

сейчас не вспомню, но где-то читал что не рекомендуется пользоваться ни setInterval, ни setTimeout,
то ли они сделаны просто для соблюдения ECMA, то ли оставлены как атавизм прошлых версий,
то ли просто не надежны, что то такое ) В общем почему не помню, но не пользуюсь этими штуками )
На самом деле не все так страшно, как Вы описали. setTimeout и setInterval это всего лишь обертки над таймером, выглядит это примерно так:
Код AS3:

package flash.utils
{
    final class SetIntervalTimer extends Timer
    {
        function SetIntervalTimer(closure:Function, delay:Number, repeats:Boolean, rest:Array)
        {
            //...
        }
 
        static function clearInterval(id_to_clear:uint) : void
        {
            //..
        }
    }
}

Просто считается, что Timer с его событиями (и другими удобностями) это true flash oop way, а setTimeOut/setInterval нет.

alatar 07.12.2011 12:53

Это выглядит не так. setInterval / setTimeout функции пакета.

Inet_PC 07.12.2011 12:54

Цитата:

Это выглядит не так. setInterval / setTimeout функции пакета.
функции, которые и вызывают этот класс. Не ну я же не с потолка этот класс взял, он лежит в playerglobal.swc.

incvizitor 07.12.2011 13:04

Есть такой класс:

Код AS3:

public function Main() {
        setTimeout(_test, 1000);
}
 
private function _test():void {
        throw(new Error("ops"));
}

Цитата:

Error: ops
at Main/_test()[D:\work\test\test\src\Main.as:42]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at SetIntervalTimer/onTimer()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

alatar 07.12.2011 13:09

Цитата:

функции, которые и вызывают этот класс.
Именно, но сами функции не являются обертками над таймером.
Цитата:

setTimeout и setInterval это всего лишь обертки над таймером

Inet_PC 07.12.2011 13:18

Цитата:

Именно, но сами функции не являются обертками над таймером.
Разве это не обертка?

alatar 07.12.2011 13:29

Где там обертка? SetIntervalTimer расширяет класс Timer. setInterval создает его экземпляр, получает id и завершается.
Что в вашем понимании "обертка"?

Inet_PC 07.12.2011 13:53

Именно

alatar 07.12.2011 13:55

Что именно?

gloomyBrain 07.12.2011 14:10

alatar, в известном смысле функция и не может быть оберткой над классом =) Паттерн wrapper тут никаким боком не имелся ввиду.

Inet_PC 07.12.2011 14:45

Цитата:

Что в вашем понимании "обертка"?
A wrapper function is a function in a computer program whose main purpose is to call a second function[1] with little or no additional computation. (Из вики)
По моему setTimeout это яркий пример функции обертки, не? Приведите тогда свой пример чтобы я понял.

i.o. 07.12.2011 15:09

в какие-то дебри полезли... :)

fish_r 07.12.2011 15:25

Цитата:

Сообщение от Inet_PC (Сообщение 1050180)
На самом деле не все так страшно, как Вы описали...

Я ничего не описывал, и мне не страшно :) А выше ребята написали где об этом говорится.

И вы, строго говоря, не правы. "Обертка" здесь допустимо как вольное описание. Но вообще-то обертка
маскирует, либо специфицирует объект для использования. А данные функции (кстати до вашего примера
не видел описания этого класса, спасибо) создают и используют экземпляры объекта.

Inet_PC 07.12.2011 16:24

Цитата:

А выше ребята написали где об этом говорится.
Да, точно, не заметил. Извиняюсь.
Цитата:

И вы, строго говоря, не правы. "Обертка" здесь допустимо как вольное описание. Но вообще-то обертка
маскирует, либо специфицирует объект для использования.
Вы видели выше своего рода определение функции обертки? А то, о чем вы написали это паттерн wrapper.

alatar 07.12.2011 16:32

Inet_PC, а вы его (определение) прочитали?
setInterval создает объект и далее в его жизни уже никак не участвует и повторно получить доступ к этому объекту она не может. Если считать конструктор обычной функцией, то можно было бы и притянуть за уши определение "обертка".

Добавлено через 4 минуты
Вот clearInterval еще можно назвать оберткой, т.к. она маскирует вызов статической функции.

Inet_PC 07.12.2011 17:07

Функция будет оберткой, когда сможет повторно получать доступ к какому-то объекту?

alatar 07.12.2011 17:09

Это следует из приведенной вами статьи.

Inet_PC 07.12.2011 18:48

Наверное я не врубаюсь, почему функция тупо (или почти тупо) вызывающая системную - это функция обертка, а setTimeout нет?

alatar 07.12.2011 19:01

Что делает обертка? Не важно для функции или объекта, смысл один. Оберка "оборачивает" (извиняйте за тавтологию) объект или функцию и подменяет его (ее) интерфейс на свой. Например, у нас есть супер-универсальная функция у которой 100500 параметров на все случаи жизни, а нам надо 100500 раз в 100500 местах вызвать эту функцию с одними и теми же параметрами, за исключением одно двух. Мы пишем функцию обертку, которая подставит нужные параметры и будет принимать не 100500 аргументов, а два или один.

Что делает setInterval? Создает новый объект и передает ему коллбек. При этом, функции которая делает тоже самое не существует и это не обертка для метода существующего объекта. Слегка похоже на фабричную функцию, только возвращает не объект, а id.

Inet_PC 07.12.2011 19:19

А ну теперь понятнее, т.е. если бы был метод setInterval у таймера с кучей параметров, тогда это была бы обертка так? Ну мне кажется, что с натяжкой это тоже обертка, не? Мы же уменьшили количество передаваемых параметров на один (repeatCount 0 или 1)?

alatar 07.12.2011 19:24

Да, тогда это было бы оберткой..


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

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