在Actionscript 3.0中结合URLRequest,URLLoader和Complete事件监听器?

时间:2010-02-27 19:22:17

标签: actionscript-3 addeventlistener urlrequest urlloader

处理数据时,我总是要编写以下内容:

var dataSourceRequest:URLRequest = new URLRequest("/path/file.xml");
var dataSourceLoader:URLLoader = new URLLoader(dataSourceRequest);
dataSourceLoader.addEventListener(Event.COMPLETE, handleDataSource);

虽然我可以理解这两个对象的有用性和事件监听器是分开的,因为它们经常互相合作,我想知道是否有一种方法可以将它们全部组合起来?我能得到的最接近的是这个,但它有点无意义/嵌套:

var dataSourceLoader:URLLoader = new URLLoader(new URLRequest("/path/file.xml"));
dataSourceLoader.addEventListener(Event.COMPLETE, handleDataSource);

我真正喜欢的是自动组合URLRequest,URLLoader和已完成的事件监听器,如下所示:

var dataSource:Whatever = new Whatever("/path/file.xml", handleDataSource);

2 个答案:

答案 0 :(得分:4)

将该代码封装到您自己的类中。它可以这么简单:

package
{
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class EncapsulatedURLLoader
    {
        protected var _callback:Function;

        public function EncapsulatedURLLoader( dataUrl:String, callback:Function )
        {
            _callback = callback;
            var l:URLLoader = new URLLoader();
            l.addEventListener( Event.COMPLETE, onComplete );
            l.load( new URLRequest( dataUrl ) );
        }

        private function onComplete( event:Event ):void 
        {
            event.target.removeEventListener( Event.COMPLETE, onComplete );
            _callback.call( null, event.target.data );
        }
    }
}

像这样使用它:

function onLoaded( data:* ):void
{
    trace( data );
}

var l:EncapsulatedURLLoader = new EncapsulatedURLLoader( "xml/data.xml", onLoaded );

答案 1 :(得分:3)

不......这是adobe制作的一个架构决定,也是一个很好的架构决定。两个班级完成不同的工作,做好这些工作。事件监听器允许您多次处理完整事件,因此比此实例中的回调更灵活。

但是,您可以创建一个包含所有功能的类,并以您希望的方式工作!