Последовательное выполнение функций

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
benzema
Сообщения: 30
Зарегистрирован: 20 июл 2012, 14:05

Последовательное выполнение функций

Сообщение benzema »

Простая задачка: Имеем n функций. Как проще всего организовать последовательное выполнение функций? После выполнения первой функций запустилась вторая, после выполнения второй запустилась третья и тд. Т.е как устранить так называемые "гонки"? Пример:

Код: Выделить всё

switch(key){    case 1:   function1();   function2();   function3();   function4();   ...........................   function n();    break;}
Аватара пользователя
manticore
Сообщения: 119
Зарегистрирован: 08 дек 2012, 18:53

Re: Последовательное выполнение функций

Сообщение manticore »

benzema
Ну у меня есть несколько вариантов. Первая это последующую функцию вставить в предыдущую, то есть внутрь function1() вставить function2() и так далее (выполнение будет точно последовательным, т.к пока не выполнится предыдущая функция, последующая никак не сможет выполнится). Есть еще вариант с for, число увеличивать постоянно и получится что при каждом увеличении выполнится своя функция. В обоих случаях не должно быть гонки функций. Последний вариант это воспользоватся еще одним switch и при каждом выполнять свою функция, без использования break, они будут выполнятся по очереди. Возможно кто-то поможет разумнее способом ;)
benzema
Сообщения: 30
Зарегистрирован: 20 июл 2012, 14:05

Re: Последовательное выполнение функций

Сообщение benzema »

первый он выгоден, если небольшое количество функций, но у меня их много, да и это уже некрасивое программирование, хотя на войне все способы хороши) а вот второй можно подумать. Но всё равно в любом случае Спасибо)
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

Re: Последовательное выполнение функций

Сообщение Serge »

Если у вас много функций, которые должны быть вызваны последовательно и вы не можете в конце каждой ставить вызов (не полное описание, а вызов) следующей - то это тоже некрасивое программирование. Хотя, как по мне, "тоже" тут не уместно, вызывать из функции другие - это нормально.
gpv123
Сообщения: 346
Зарегистрирован: 29 янв 2012, 20:57

Re: Последовательное выполнение функций

Сообщение gpv123 »

Запихните все функции в массив и пройдитесь по ним из цикла. В чем проблема?
benzema
Сообщения: 30
Зарегистрирован: 20 июл 2012, 14:05

Re: Последовательное выполнение функций

Сообщение benzema »

gpv123, я, возможно, вас не допонял. Но какой смысл их в массив запихивать и проходиться по ним из цикла? Мне нужно устранить "гонки", те организовать последовательное выполнение функций: Выполнилась 1 функция, запустилась вторая, выполнилась вторая, запустилась третья и тд. Задачка усложняется тем, что имеем множество функций, поэтому вызывать их друг из друга нерационально. Так что вот ищем панацею. Я думаю многие программисты сталкивались с данной проблемой. Поэтому предлагайте, свои варианты решения и выберем самый рациональный. Мне подсказали рыть в сторону callback, но на AS 3.0 я не сталкивался с ним.

ах да, у меня в функциях объект перемещается по сцене по таймеру. поэтому тут уместно говорить про гонки и нельзя функции написать друг за другом.
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Последовательное выполнение функций

Сообщение Alazaur »

gpv123, вам дело говорит.

Код: Выделить всё

var arr:Array = [func1, func2, func3];for(var i:int = 0; i < arr.length; i++){   arr[i]();} function func1():void{    var mc:MovieClip;    for (var i:int = 0; i < 1000; i++)     {        mc = new MovieClip();        addChild(mc);    }   trace(1);} function func2():void{   trace(2);} function func3():void{   trace(3);}
При условии, что в функциях нет асинхронности они будут выполняться одна за другой. Я специально для примера сделал первую функцию нагруженней остальных, с циклом создающим 1000 клипов.
Если же у вас есть асинхронность (например подгрузка внешних данных), то без колбеков или рассылки событий вам не обойтись.
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Последовательное выполнение функций

Сообщение Casperovskii »

Alazaur
Ну ты, как всегда, пришел и разрулил ситуацию.
benzema
Сообщения: 30
Зарегистрирован: 20 июл 2012, 14:05

Re: Последовательное выполнение функций

Сообщение benzema »

В том то и дело что асинхронность. Вот примерно мой код:

Код: Выделить всё

 var bool:Boolean = true;  var timer:Timer = new Timer(5000,1);timer.addEventListener(TimerEvent.TIMER_COMPLETE, onComplete); function onComplete(e:TimerEvent):void{    if(bool)    {        trace("5");    }    else    {        trace("10");    }} function one():void{    timer.start();} function two():void{    timer.reset();    bool = false;    timer.start();} var arr:Array = [one, two];  for(var i=0; i<arr.length;i++){    arr[i]();}
benzema
Сообщения: 30
Зарегистрирован: 20 июл 2012, 14:05

Re: Последовательное выполнение функций

Сообщение benzema »

Трейс выведет 10 через 5 сек, а нужно через 5 секунд запуска - 5, а ещё через 5 сек - 10.
Ответить