Страница 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.