简单的URLRequest Event.COMPLETE循环问题

时间:2011-05-18 01:25:21

标签: flash actionscript-3

如何重新组织下面的代码,以便trace命令为photourls数组中的每个元素输出i而不仅仅是最后一个元素?在6元素数组中,trace(i);行输出5,5,5,5,5,5而不是0,1,2,3,4,5。

for (var i in photourls) {
    loaders[i] = new Loader();
    var img:URLRequest = new URLRequest(photourls[i]);
    loaders[i].load(img);
    addChild (loaders[i]);
    loaders[i].contentLoaderInfo.addEventListener(Event.COMPLETE, function(e){
                trace(i);
                trace(loaders[i]);
            });
}

非常感谢

2 个答案:

答案 0 :(得分:2)

// list of photo urls
var photourls:Array = [/* ??? */];

// vars
var vars:Array = [];
var count:uint = 0;

// loop vars
var info:Object;
var ldr:Loader;
var img:URLRequest;

// load images in list
var i:String;
for each(i in photourls)
{
    ldr = new Loader();
    img = new URLRequest(i);

    /**
     * DEFINE YOUR VARS IN THIS OBJECT
     * -------------------------------
     */
    info =
    {
        target: ldr.contentLoaderInfo,
        url: i,
        counter: ++count,
        other: img
    };

    vars[vars.length] = info;

    ldr.load(img);
    addChild(ldr);

    ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, _complete);
}

// complete event
function _complete(e:Event):void
{
    var t:LoaderInfo = LoaderInfo(e.target);

    // find storage object
    var object:Object;
    for each(object in vars)
    {
        if(object.target == t) break;
    }

    // example trace of info
    trace(object.url);
    trace(object.counter);

    t.removeEventListener(Event.COMPLETE, _complete);
}

上面是一个非常混乱的例子,我创建了你自己的加载器类,它有你想要跟踪的变量,并在你创建加载器时设置这些变量。我会做一个例子。

您的 MyLoader 类:

package
{
    import flash.display.Loader;
    import flash.events.Event;
    import flash.net.URLRequest;

    public class MyLoader extends Loader
    {
        // vars
        private var _url:String;
        public var id:uint;

        /**
         * Loads an object
         * @param url The URL to the object to load
         */
        public function myLoad(url:String):void
        {
            var req:URLRequest = new URLRequest(url);
            load(req);

            contentLoaderInfo.addEventListener(Event.COMPLETE, _complete);

            _url = url;
        }

        /**
         * Load complete
         */
        private function _complete(e:Event):void
        {
            contentLoaderInfo.removeEventListener(Event.COMPLETE, _complete);

            trace(id, url);
        }

        /**
         * Getters
         */
        public function get url():String{ return _url; }
    }
}

然后循环浏览列表并创建以下内容:

var photourls:Array = [/* ??? */];

var ldr:MyLoader;
var id:uint = 0;

var i:String;
for each(i in photourls)
{
    ldr = new MyLoader();

    ldr.id = ++id;
    ldr.myLoad(i);

    addChild(ldr);
}

答案 1 :(得分:2)

问题在于此代码:

loaders[i].contentLoaderInfo.addEventListener(Event.COMPLETE, function(e){
            trace(i);
            trace(loaders[i]);
        });

因为“i”将在周围循环的整个过程中继续改变,所以这里仅使用“i”的最终值。我建议这个改变:

// place this outside of the loop.
function independantTrace( ...args:Array ):Function
{
    return function( ...a:* ):void{trace( args.join( "\n" ) );}
}

loaders[i].contentLoaderInfo.addEventListener(Event.COMPLETE, 
                                              independantTrace(i,loaders[i]));

这将在循环中将该函数绑定到i和loaders [i]的值而不是“i”变量。