Лучший способ последовательности вызовов методов / функций Flex / Actionscript - PullRequest
0 голосов
/ 12 августа 2011

ОК, насколько я знаю, ActionScript во Flex работает асинхронно.Мне нужна возможность запустить метод в цикле синхронно.Рассмотрим этот код:

public class CustomerContainer extends VBox
{

    public function CustomerContainer ()
    {
        super();
        addEventListener(FlexEvent.CREATION_COMPLETE, 
                         this_creationCompleteHandler);

    }

    public function build():void
    {
                   //process something here

    }
}

Теперь у нас есть цикл for в нашем файле MXML

<mx:Script>
<![CDATA[

    private var newContainer:CustomerContainer;

    public function foo():void
    {
      for (var i:int = 0; i < EndingNumber; i++)
      {

        newContainer  = new CustomerContainer();
        newContainer.build();//I need this to finish before it goes on to the 
        // next one. here is where the problem is flex runs through this loop 
        // creating each new object but I do not know if the first 1 object is 
        // complete before it begin processing the second one in the For Loop. 
      }
    }
   ]]>
</mx:Script>

Это не моя точная ситуация, так как здесь немного сложнее объяснить.Существует абстрактный класс и несколько пользовательских объектов представления, полученных из него.Некоторые из представлений зависят от того, будут ли завершены другие, но я не могу расположить их в правильном порядке.Таймеры не вариант.Возможно, не объяснил это правильно.

Ответы [ 2 ]

0 голосов
/ 12 августа 2011

Мне нравится решать этот путь по Lisp-y:

// tell this function to start creating. 
private function initContainers( count:int ):void
{
     if( count <= 0 ) return;
     var newContainer:CustomerContainer = new CustomerContainer();
     newContainer.build();
     /* ... stuff happens ... */ 
     newContainer.addEventListener( FlexEvent.CREATION_COMPLETE,
                                    function( fe:FlexEvent ):void
                                    {
                                        // tell the function to create one fewer
                                        initContainers( count - 1 );
                                    } );
}

Ваша последовательность:

  1. initContainers (x) ->
    1. создать контейнер.
    2. ожидание события ->
  2. initContainers (x - 1);
    1. создать контейнер.
    2. ожидание события -> <!-- lots o' more -->
0 голосов
/ 12 августа 2011

Взгляните на библиотеку Task от Cairngorm.

Она позволяет упорядочивать единицы работы и запускать их последовательно, параллельно или одновременно.

В противном случае работа с прослушивателями событий и условиями ошибок быстро выходит из-под контроля.

...