Простая проблема цикла URLRequest Event.COMPLETE - PullRequest
0 голосов
/ 18 мая 2011

Как я могу реорганизовать приведенный ниже код, чтобы команды трассировки выводили i для каждого элемента в массиве photourls, а не только для последнего элемента?В массиве из 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 ]

2 голосов
/ 18 мая 2011

Проблема с этим кодом здесь:

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».

2 голосов
/ 18 мая 2011
// 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...