Как получить связанный URLRequest из Event.COMPLETE, запущенного URLLoader - PullRequest
3 голосов
/ 26 февраля 2010

Допустим, мы хотим загрузить XML -

var xmlURL:String = 'content.xml';
var xmlURLRequest:URLRequest = new URLRequest(xmlURL);
var xmlURLLoader:URLLoader = new URLLoader(xmlURLRequest);
xmlURLLoader.addEventListener(Event.COMPLETE, function(e:Event):void{
 trace('loaded',xmlURL);
 trace(XML(e.target.data));
});

Если нам нужно знать исходный URL для этого конкретного документа XML, у нас есть эта переменная, чтобы сообщить нам, верно? Теперь давайте представим, что переменная xmlURL не существует, чтобы помочь нам - возможно, мы хотим загрузить 3 XML-документа, названных по порядку, и мы хотим использовать одноразовые переменные внутри цикла for:

for(var i:uint = 3; i > 0; i--){
 var xmlURLLoader:URLLoader = new URLLoader(new URLRequest('content'+i+'.xml'));
 xmlURLLoader.addEventListener(Event.COMPLETE, function(e:Event):void{
  trace(e.target.src); // I wish this worked...
  trace(XML(e.target.data));
 });
}

Вдруг это не так просто, верно?

Я ненавижу, что вы не можете просто сказать e.target.src или что-то еще - есть ли хороший способ связать URLLoaders с URL, с которого они загружали данные? Я что-то пропустил? Мне это кажется не интуитивным.

Ответы [ 2 ]

7 голосов
/ 26 февраля 2010
for (var i:uint = 3; i > 0; i--) {
    var src:URLRequest = new URLRequest('content'+i+'.xml');
    var xmlURLLoader:URLLoader = new URLLoader(src);
    xmlURLLoader.addEventListener(Event.COMPLETE, function(req:URLRequest):Function {
        return function(e:Event):void {
            trace(req); // Should work
            // whatever you need to do
        }
    }(src));
}

Вы должны использовать вторую функцию для переноса запроса, в противном случае все три прослушивателя событий будут ссылаться на последний запрос.

2 голосов
/ 24 мая 2010

sberry2A находится на правильном пути. Роберт Пеннер недавно показал нам, что URLLoader - это ничто иное, как крошечная оболочка вокруг нативного URLStream, поэтому разумной идеей является использование собственного URLLoader.

Вот как я катаюсь:

public class URLLoader extends EventDispatcher{     
    private var _urlRequest:URLRequest; //the built-in URLLoader doesn't give you any access to the requested URL...
    private var _stream:URLStream;
    private var _dataFormat:String;// = "text"
    private var _data:*;
    private var _bytesLoaded:uint;// = 0
    private var _bytesTotal:uint;// = 0

    public function get request():URLRequest { return _urlRequest;}     
    public function get fileName():String { return _urlRequest.url.match(/(?:\\|\/)([^\\\/]*)$/)[1];}       
    public function get dataFormat():String { return _dataFormat;}      
    public function get data():* { return _data; }      
    public function get bytesLoaded():uint { return _bytesLoaded; }     
    public function get bytesTotal():uint { return _bytesTotal; }       

    public function URLLoader(request:URLRequest = null){
        super();
        _stream = new URLStream();
        _stream.addEventListener(Event.OPEN, openHandler);
        _stream.addEventListener(ProgressEvent.PROGRESS, progressHandler);
        _stream.addEventListener(Event.COMPLETE, completeHandler);
        _stream.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        _stream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
        _stream.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
        if (request != null){
            load(request);
        };
    }
    public function load(request:URLRequest):void {
        _urlRequest = request;
        _stream.load(_urlRequest);
    }
    public function close():void{
        _stream.close();
    }

    private function progressHandler(event:ProgressEvent):void {
        _bytesLoaded = event.bytesLoaded;
        _bytesTotal = event.bytesTotal;
        dispatchEvent(event);
    }
    private function completeHandler(event:Event):void{
        var bytes:ByteArray = new ByteArray();
        _stream.readBytes(bytes);
        switch (_dataFormat){
            case "binary":
                _data = bytes;
                break;
            case "variables":
                if (bytes.length > 0){
                    _data = new URLVariables(bytes.toString());
                    break;
                };
            case "text":
            default:
                _data = bytes.toString();
                break;
        };
        trace("URLLoader: (" + fileName + "): " + event.type);
        dispatchEvent(event);
    }
    private function openHandler(event:Event):void {
        trace("URLLoader: ("+fileName+"): " + event.type +" "+_urlRequest.url);
         dispatchEvent(event);
    }
    private function securityErrorHandler(event:SecurityErrorEvent):void {
        trace("URLLoader ("+fileName+"): " + event.type + " - " + event.text);
        dispatchEvent(event);
    }
    private function httpStatusHandler(event:HTTPStatusEvent):void {          
        dispatchEvent(event);
    }   
    private function ioErrorHandler(event:IOErrorEvent):void {
         trace("URLLoader ("+fileName+"): " + event.type + " - " + event.text);
        dispatchEvent(event);
    }       
}

Обратите внимание на свойства request и fileName. Чтобы получить URLRequest из обработчика события COMPLETE, вы просто делаете: var req:URLRequest = URLLoader(evtObj.target).request;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...