Страница 1 из 2
Последовательное выполнение функций
Добавлено: 07 янв 2013, 02:31
benzema
Простая задачка: Имеем n функций. Как проще всего организовать последовательное выполнение функций? После выполнения первой функций запустилась вторая, после выполнения второй запустилась третья и тд. Т.е как устранить так называемые "гонки"? Пример:
Код: Выделить всё
switch(key){ case 1: function1(); function2(); function3(); function4(); ........................... function n(); break;}
Re: Последовательное выполнение функций
Добавлено: 07 янв 2013, 02:43
manticore
benzema
Ну у меня есть несколько вариантов. Первая это последующую функцию вставить в предыдущую, то есть внутрь function1() вставить function2() и так далее (выполнение будет точно последовательным, т.к пока не выполнится предыдущая функция, последующая никак не сможет выполнится). Есть еще вариант с for, число увеличивать постоянно и получится что при каждом увеличении выполнится своя функция. В обоих случаях не должно быть гонки функций. Последний вариант это воспользоватся еще одним switch и при каждом выполнять свою функция, без использования break, они будут выполнятся по очереди. Возможно кто-то поможет разумнее способом

Re: Последовательное выполнение функций
Добавлено: 07 янв 2013, 02:48
benzema
первый он выгоден, если небольшое количество функций, но у меня их много, да и это уже некрасивое программирование, хотя на войне все способы хороши) а вот второй можно подумать. Но всё равно в любом случае Спасибо)
Re: Последовательное выполнение функций
Добавлено: 07 янв 2013, 10:17
Serge
Если у вас много функций, которые должны быть вызваны последовательно и вы не можете в конце каждой ставить вызов (не полное описание, а вызов) следующей - то это тоже некрасивое программирование. Хотя, как по мне, "тоже" тут не уместно, вызывать из функции другие - это нормально.
Re: Последовательное выполнение функций
Добавлено: 09 янв 2013, 14:42
gpv123
Запихните все функции в массив и пройдитесь по ним из цикла. В чем проблема?
Re: Последовательное выполнение функций
Добавлено: 11 янв 2013, 01:22
benzema
gpv123, я, возможно, вас не допонял. Но какой смысл их в массив запихивать и проходиться по ним из цикла? Мне нужно устранить "гонки", те организовать последовательное выполнение функций: Выполнилась 1 функция, запустилась вторая, выполнилась вторая, запустилась третья и тд. Задачка усложняется тем, что имеем множество функций, поэтому вызывать их друг из друга нерационально. Так что вот ищем панацею. Я думаю многие программисты сталкивались с данной проблемой. Поэтому предлагайте, свои варианты решения и выберем самый рациональный. Мне подсказали рыть в сторону callback, но на AS 3.0 я не сталкивался с ним.
ах да, у меня в функциях объект перемещается по сцене по таймеру. поэтому тут уместно говорить про гонки и нельзя функции написать друг за другом.
Re: Последовательное выполнение функций
Добавлено: 11 янв 2013, 02:32
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 клипов.
Если же у вас есть асинхронность (например подгрузка внешних данных), то без колбеков или рассылки событий вам не обойтись.
Re: Последовательное выполнение функций
Добавлено: 11 янв 2013, 08:59
Casperovskii
Alazaur
Ну ты, как всегда, пришел и разрулил ситуацию.
Re: Последовательное выполнение функций
Добавлено: 13 янв 2013, 10:03
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]();}
Re: Последовательное выполнение функций
Добавлено: 13 янв 2013, 10:06
benzema
Трейс выведет 10 через 5 сек, а нужно через 5 секунд запуска - 5, а ещё через 5 сек - 10.