为什么这不起作用,因为我认为它会:
var i:int=-1;
for each(obj in myData)
{
i++;
var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(event:Event)
{
trace(i);
});
}
myData中有3个对象,trace语句如下:
2
2
2
而不是:
0
1
2
如果我将i
添加到数组(如myArr.push(i)
),它将包含3个元素,0,1和2。
有什么想法吗? 谢谢。
答案 0 :(得分:3)
这是你采取的一种非常糟糕的方法......只是不要做你想做的任何事情,它会没事......在这里使用匿名函数没有意义(实际上从来没有在AS3中),没有必要使用for-each
,因为您需要的是for(;;)
。你使用动态类型没有任何好处(AS3中的动态类型没有任何好处,反正从来没有)。并且,是的,闭包将捕获上下文,上下文只有一个i
,它的值是2,所以第一个跟踪是你应该期待的。
您应该做什么 - 将加载器存储在某些数据结构中,稍后从该数据结构中获取它们(当您需要该标识符时)。并且,为了我们的用户,请加载按顺序加载的任何内容 - 因为如果不这样做,我们将收到您未处理的IO错误...
答案 1 :(得分:1)
首先让我告诉你为什么它不能像你期望的那样工作。
发生的事情是,for循环遍历你的元素,并创建所有加载器,递增i
,但Event.COMPLETE
稍后发生,其中i
已经在值{ {1}},这就是你得到那个输出的原因。
建议 wvxvw ,您需要更多数据结构,如下所示:
2
你将在循环中使用它:
class MyLoader {
private var i: int;
private var loader: Loader;
function MyLoader(i:int) {
this.i = i;
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
}
function onLoaded(event:Event)
{
trace(i);
}
}
当然,您需要向MyLoader添加更多内容,例如处理错误,并传递更多有意义的内容以使一切正常。