Da uma olhada na documentação do SWIZ framework, www.swizframework.org e 
procura Chain events...

Bruno

Sent from my iPhone

On 18/10/2011, at 12:29 PM, Fredy Gadotti <[email protected]> wrote:

> Você poderia fazer o seguinte:
> 
> - declarar uma variável inteira na sua classe para controlar o índice de 
> processamento e iniciar como 0
> - adicionar um event listener para sua função se processamento recursivo
> - ao terminar seu processamento recursivo, incrementar o índice e disparar 
> evento para processar o próximo
> - terminando de varrer tudo, resetar o índice para 0 novamente
> 
> Pseudo-código:
> 
> private var processIndex:uint = 0;
> 
> protected function startUp():void {
>     addEventListener(MyEvent.DO_STEP, stepHandler);
> }
> 
> private function stepHandler(event:MyEvent):void {
>      dataProvider.getItemAt(processIndex);
>      
>      // Alguma lógica 
>    
>      asyncFunction();
> }
> 
> private function asyncFunction():void {
>    // Faz processamento
>    processIndex++;
>    dispatcheEvent(new MyEvent(MyEvent.DO_STEP));
> }
> 
> 
> 
> Sacou a moral do negócio?
> 2011/10/18 Leonardo Oliveira <[email protected]>
> obrigado pela resposta Fredy. cara, a situação que tenho é um pouco
> diferente. comentei no código. o trecho é este:
> 
> private function
> setarIconesRecursivo(dataProvider:ArrayCollection):void{
>        for(var i:uint=0; i<dataProvider.length;i++){
>                if(dataProvider[i].icone != null){
>                        //disparo um evento customizado com o ítem do tree que 
> vai receber
> o ícone
>                        //foi a forma que encontrei de saber qual
> elemento vai receber o ícone dentro do getBitmapData
>                        //mas se houver uma maneira mais inteligente
> de passar parâmetro para um handler gostaria de saber
>                        evento = new EventLoadCustom("customEvent");
>                        evento.evtItemTree = dataProvider[i];
>                        dispatchEvent(evento);
>                        //adiciono um handler para o loader e caggego os bytes 
> do bytearray
> (dataProvider[i].icone:ByteArray)
>                        loader = new Loader();
>                        
> loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
> getBitmapData);
>                        loader.loadBytes(dataProvider[i].icone);
>                }
>                if(dataProvider[i].children != null){
>                        
> setarIconesRecursivo(ArrayCollection(dataProvider[i].children));
>                        return;
>                }
>        }
> }
> 
> private function getBitmapData(evt:Event):void{
>        var conteudo:* = loader.content;
>        bitmapData = new BitmapData(conteudo.width,conteudo.height,true,
> 0x00000000);
>        var matriz:Matrix = new Matrix();
>        bitmapData.draw(conteudo, matriz,null,null,null,true);
>        //esse RuntimeBitmapAsset.getClass vai retornar o BitmapData como
> Class, que é o parâmetro esperado pelo setItemIcon
>        var icone:Class = RuntimeBitmapAsset.getClass(bitmapData);
>        //agora posso setar o ícone no item do evento disparado
>        _menuTree.setItemIcon(evento.evtItemTree, icone, null);
> }
> 
> o problema é que quando disparo o evento customizado e carrego o
> loader a execução não passa para o handler, mas continua no loop, ou
> seja, o evento customizado envia outro ítem e o loader carrega outro
> ícone e assim sucessivamente até o último elemento do loop. então só
> vou conseguir entrar no handler no último ítem do loop por isso
> somente o último elemento do tree com ícone vai receber a imagem.
> então como resolver isto?
> 
> 
> On 18 out, 09:30, Fredy Gadotti <[email protected]> wrote:
> > Ele só é assíncrono para chamadas remotas e alguns outros casos especiais.
> > Esse código que você mandou é síncrono.
> >
> > Não seria que você gostaria de fazer?
> >
> > if (i % 2 == 0){
> >    // função
> >
> > }
> >
> > Att,
> >
> > Fredy
> >
> > 2011/10/18 Leonardo Oliveira <[email protected]>
> >
> >
> >
> >
> >
> >
> >
> > > eu sei que o flex é assíncrono, portanto se estou em um loop e dentro
> > > do loop chamo uma outra função, ele vai terminar o loop primeiro e
> > > depois chamar a função. existe uma forma de forçar o processamento
> > > síncrono no flex? a situação é esta (apenas exemplificando):
> >
> > > private function teste():void{
> > >     for(var i:uint=0; i<10; i++){
> > >          if(i/2==0){
> > >               teste2(i); //chamar função teste2 passando o número par
> > >          }
> > >     }
> > > }
> >
> > > private function teste2(param:uint):void{
> > >     //faz alguma coisa com param
> > > }
> >
> > > como se fosse assim:
> > > private function teste():void{
> > >     for(var i:uint=0; i<10; i++){
> > >          if(i/2==0){
> > >               //faz alguma coisa com i
> > >          }
> > >     }
> > > }
> >
> > > --
> > > Você recebeu esta mensagem porque está inscrito na lista "flexdev"
> > > Para enviar uma mensagem, envie um e-mail para [email protected]
> > > Para sair da lista, envie um email em branco para
> > > [email protected]
> > > Mais opções estão disponíveis emhttp://groups.google.com/group/flexdev
> 
> --
> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
> Para enviar uma mensagem, envie um e-mail para [email protected]
> Para sair da lista, envie um email em branco para 
> [email protected]
> Mais opções estão disponíveis em http://groups.google.com/group/flexdev
> 
> -- 
> Você recebeu esta mensagem porque está inscrito na lista "flexdev"
> Para enviar uma mensagem, envie um e-mail para [email protected]
> Para sair da lista, envie um email em branco para 
> [email protected]
> Mais opções estão disponíveis em http://groups.google.com/group/flexdev

-- 
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para [email protected]
Para sair da lista, envie um email em branco para 
[email protected]
Mais opções estão disponíveis em http://groups.google.com/group/flexdev

Responder a