将局部变量传递给加载器匿名处理函数

时间:2011-10-22 14:06:04

标签: actionscript-3 flex

为什么这不起作用,因为我认为它会:

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。

有什么想法吗? 谢谢。

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添加更多内容,例如处理错误,并传递更多有意义的内容以使一切正常。