Cairngorm框架中的Chained Event - 如何实现事件序列

本文介绍了如何在Cairngorm框架中使用ChainedEvent机制来实现一系列事件的有序触发,并能够在执行过程中提前退出序列。具体包括自定义ChainEvent类、创建事件链、以及如何在Command中处理事件链。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近在学习Cairngorm框架,并且在Marcus的指导下,利用该框架来完成一个很小的应用(只有一页...)。

 Cairngorm下的事件具有异步的特性,比如说,触发10个事件(CairngormEvent),每个事件去调用不同的Server端,并返回XML结构的结果。如果依次触发这10个事件,返回结果的时候,并不一定会是按触发的顺序来分别返回结果的。

 事件异步的特性使得数据的取得更灵活,但是也有它的缺点。比如下面的情况:有一系列事件,调用相同的HTTPService服务,通过传递参数的不同,来实现相近的服务器端操作(我在做的是在服务器端,根据JSP数据生成静态的 HTML页面...)。这一系列事件的触发,如果使用普通的Cairngorm的事件机制,则没有办法在事件序列执行过程中,退出序列。因为你并不能确定什么事件已经触发而什么事件还没触发。所以,需要引入Chained Event
 
 主要步骤:
 1.自定义一个ChainEvent,继承CairngormEvent。定义一个变量nextChainEvent,以保存下一个Event的对象。
  1. public class ChainEvent extends CairngormEvent
  2. {
  3.     public function ChainEvent( type:String )
  4.     {
  5.         super( type );
  6.     }
  7.     
  8.     public var nextChainedEvent:ChainEvent;
  9. }
 2.所有要加入序列的事件,都继承自ChainEvent类,初始化这些事件,并使每个事件对象中的nextChainEvent变量保存有下一个事件的对象。
  1. public class EventChainFactory
  2. {
  3.     public static function chainEvents( evts:Array ):ChainEvent
  4.     {
  5.         var len:int = evts.length;
  6.         if ( len < 1 )
  7.             return null;
  8.                 
  9.         var returnEvent:ChainEvent = evts[ 0 ] as ChainEvent;
  10.             
  11.         var i:int = len-1;
  12.         for ( i; i>=0; i-- )
  13.         {
  14.             if ( i != ( len-1 ) )
  15.             {
  16.                 var e:ChainEvent = evts[ i ] as ChainEvent;
  17.                 var next_e:ChainEvent = evts[ i+1 ] as ChainEvent;
  18.                 e.nextChainedEvent = next_e;
  19.             }
  20.         }
  21.             
  22.         return returnEvent;
  23.     }
  24. }

 3.自定义的Command类要继承SequenceCommand。在处理HTTPService返回值的方法里,首先判断一个保存在 ModelLoacator里的标志位(abortProcess),abortProcess等于true则把下一个事件对象付给nextEvent,然后调用executeNextCommand()。
  1. public class ExecuteBulkGenerationCommand extends SequenceCommand implements ICommand {
  2.     private var __model:StaticContentGenModel = StaticContentGenModel.getInstance();
  3.     private var __section:SectionVO = null;
  4.     private var __event:CairngormEvent = null;
  5.         
  6.     override public function execute(event:CairngormEvent):void {
  7.         var responder:Responder = new Responder(onResult_processDone, onFault);
  8.         __section = ( event as ExecuteBulkGenerationEvent ).section;
  9.         __event = event;
  10.         var delegate:ExecuteBulkGenerationDelegate = new ExecuteBulkGenerationDelegate( responder );
  11.         delegate.staticContentGen( __section );
  12.         }
  13.         
  14.     public function onResult_processDone( event:ResultEvent ):void {
  15.         // event结果返回XML结构数据
  16.         var path:String = event.result.result.path;
  17.         var errorMsg:String = event.result.result.errorMessage;
  18.         var processDone:Boolean = event.result.result.success as Boolean;
  19.        
  20.         __model.results.addItem( path );
  21.        
  22.         // 判断全局标志位, 触发下一个序列中的事件 
  23.         if( !__model.abortGeneration ) {
  24.             nextEvent = ChainEvent( __event ).nextChainedEvent;
  25.             this.executeNextCommand();
  26.         }
  27.     }
  28.         
  29.     public function onFault( event:Event ):void {
  30.         __model.results.addItem( "Fault on ExecuteBulkGenerationCommand. Section : " + 
  31.                 __section.section + " ; Mode : " + __section.generationMode );
  32.         trace("Fault on ExecuteBulkGenerationCommand: " + event.toString());
  33.     }
  34. }

 4.使用异步机制事件来修改标志位(abortProcess)。

 5.调用代码示例
  1. private function build():void
  2. {
  3.     // TestAEvent,TestBEvent均继承自ChainEvent,见步骤1
  4.     var chain : ChainEvent = EventChainFactory.chainEvents([
  5.         new TestAEvent(), new TestBEvent()]);
  6.     cgDispatcher.dispatchEvent( chain );
  7. }
参考: http://undefined-type.com/index.php/2008/08/07/cairngorm-chain-events  (提供了ChainEvent的主要框架,个人添加了退出事件序列的机制 :P)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值