• 【Flex】实现模块顺序执行


      Flex属于单线程,基于事件监听的异步处理机制,让人又爱又恨。全异步的处理方法,使代码遍布addEventListener和xxxHandler,没有顺序执行的代码一气呵成,且实现顺序执行很是复杂,无非就是前一个操作Handler中启动下一个操作,如此循环下去。

      最近在Cairngorm 3的类库中发现了实现顺序执行的类库Task Library,支持Flex3 & 4,目前版本为1.7。

      Task Library 任务库
      Cairngorm任务库提供了一个顺序和并行执行任务的抽象。它可能被用于协调一个应用程序的启动序列,或管理需要特定的顺序进行的一系列异步进程。

      介绍、文档及下载:http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm+Libraries

      翻译:http://hi.baidu.com/taotao5453/blog/item/e5f322f5798b8228bd310939.html


      无论是顺序执行任务或者并行执行任务,Task Library的核心是Task。自定义Task时需继承Task,覆写performTask方法,并在该Task完成时调用complete方法。

      顺序执行任务需添加Task到SequenceTask,当执行完最后一个任务后,会派发TaskEvent.TASK_COMPLETE事件。

      并行执行任务需添加Task到ParallelTask,当所有任务都执行完毕后,才派发TaskEvent.TASK_COMPLETE事件。


      读取单个XML文件的Task

    import com.adobe.cairngorm.task.Task;
    	
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    	
    public class XMLTask extends Task
    {
        private var name:string;
        private var filename:string;
    
        public function XMLTask(name:string, filename:String)
        {
            this.name = name;
            this.filename = filename;
        }
    
        override protected function performTask():void
        {
            var urlLoader:URLLoader = new URLLoader();
            urlLoader.addEventListener(Event.COMPLETE, completeHandler);
            urlLoader.load(new URLRequest(filename));
        }
    
        private function completeHandler(e:Event):void
        {
            var urlLoader:URLLoader = e.target as URLLoader;
            XMLLocator.getInstance()[name] = new XML(urlLoader.data); //可按实际情况保存获取的值,这里用单例模式保存供其他程序使用
            complete();
        }
    
    }

      顺序读取多个XML文件

    protected function creationCompleteHandler(event:FlexEvent):void
    {
        var task:SequenceTask = new SequenceTask();
        task.addChild(new XMLTask("config", "config.xml"));
        task.addChild(new XMLTask("rule", "rule.xml"));
        task.addChild(new XMLTask("message", "message.xml"));
        task.addEventListener(TaskEvent.TASK_COMPLETE, taskCompleteHandler);
        task.start();
    }
    
    private function taskCompleteHandler(event:TaskEvent):void
    {
        var xml:XMLLocator = XMLLocator.getInstance();
        trace(xml.config);
        trace(xml.rule);
        trace(xml.message);
    }
    

      上面例子如需要并行读取,只需要把SequenceTask换成ParallelTask即可。

      具体内容参考《cairngorm3工具类库Task》http://blog.chinaunix.net/space.php?uid=122937&do=blog&id=143124

      注:我觉得Task Library适用于多个异步方法或异步方法与其他方法的顺序或并行执行中,如URLLoader、HTTPService、WebService、RemoteObject等需要事件通知完成的类。

      

     
  • 相关阅读:
    Vue打包之后部署到 express 服务器上
    Vue 点击事件传递原生DOM事件?
    CSS hover 改变另外一个元素状态
    element-UI el-table二次封装
    element-UI el-table添加序号列时序号永远都是从1开始?
    element-UI el-table表格根据搜索条件表格值改变颜色
    HTML head meta标签详细
    CodeForces 489C Given Length and Sum of Digits... (dfs)
    CodeForces 489B BerSU Ball (水题 双指针)
    Codeforces 489A SwapSort (水题)
  • 原文地址:https://www.cnblogs.com/litou/p/2227869.html
Copyright © 2020-2023  润新知