2

データを処理するとき、私は常に次のように書く必要があります。

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

これらの2つのオブジェクトとイベントリスナーが分離していることの有用性は理解できますが、それらは互いに連携することが多いため、それらすべてを組み合わせる方法があるかどうかを知りたいですか?私が得ることができる最も近いものはこれですが、それは少し無意味/入れ子です:

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);
4

2 に答える 2

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 );
于 2010-03-02T17:02:14.007 に答える
3

いいえ...それはadobeが下したアーキテクチャ上の決定であり、それは良いことです。2つの2つのクラスは非常に異なる仕事をし、それらの仕事をうまくやります。イベントリスナーを使用すると、イベント全体を複数回処理できるため、このインスタンスのコールバックよりもはるかに柔軟性があります。

ただし、そのすべての機能をラップし、希望どおりに機能するクラスを作成することはできます。

于 2010-02-27T19:27:14.823 に答える