如何从URLLoader触发的Event.COMPLETE获取关联的URLRequest

mat*_*amp 3 oop flash events actionscript-3

所以我们假设我们想要加载一些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));
});
Run Code Online (Sandbox Code Playgroud)

如果我们需要知道该特定XML文档的源URL,我们就有这个变量来告诉我们,对吧?现在让我们假设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));
 });
}
Run Code Online (Sandbox Code Playgroud)

突然间,这不是那么容易,对吧?

我讨厌你不能只说e.target.src或其他什么 - 有没有一种好方法将URLLoaders与他们加载数据的URL相关联?我错过了什么吗?这对我来说感觉不直观.

Cor*_*sky 7

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));
}
Run Code Online (Sandbox Code Playgroud)

您必须使用第二个函数来包装请求,否则所有三个事件侦听器都将引用最后一个请求.