Применять функцию динамически в AS3 - PullRequest
0 голосов
/ 04 ноября 2010

Я пытаюсь динамически настроить некоторые обратные вызовы для слушателей по умолчанию, и в настоящий момент я не добиваюсь большого успеха.

Массив:

var URLLoader_SharedCallbacks:Array = new Array();
URLLoader_SharedCallbacks.push(new Array (HTTPStatusEvent, HTTPStatusEvent.HTTP_STATUS, "URLLoader_HTTPStatus"));
URLLoader_SharedCallbacks.push(new Array (IOErrorEvent, IOErrorEvent.IO_ERROR, "URLLoader_IOError"));
URLLoader_SharedCallbacks.push(new Array (Event, Event.OPEN, "URLLoader_Open"));

А потом:

function URLLoader_SharedCallbacks_Add(ul:URLLoader):void
{
    for each(var arr:Array in this.URLLoader_SharedCallbacks)
    {
        var fnc:Function = function(evt:arr[0])
        {
            trace("evt = " + evt)
        }
        if(!this[ul].hasEventListener(arr[2]))
        {
            this[ul].addEventListener(fnc);
        }
    }
}

Предложения

1 Ответ

1 голос
/ 04 ноября 2010

, даже если вам нужно получить что-то очень конкретное из этих событий, лучше всего выбрать следующее:

private function handler(e:Event): void{
    switch(e.type){
         case IOErrorEvent.IO_ERROR:
         //treat it like IOErrorEvent
         break;
         case Event.CLOSE:
         //treat it like Event.CLOSE
         break;
         case HTTPStatusEvent.HTTP_STATUS:
         //treat it like HTTPStatusEvent
         break;
    }
}

и о динамической генерации, если это действительно единственное решение:

создать 2 массива - для диспетчеров и для функций слушателя.и еще один для хранения описаний пар диспетчер-слушатель.или вы можете хранить диспетчер со слушателем и описанием в объекте и иметь массив таких объектов, или, возможно, разработать конкретную структуру данных ... в любом случае:

private var funcArray: Array = new Array();
private var loaderArray: Array = new Array();
private var infoArray: Array = new Array();
private function createListener():Function {
    var fn:Function = function(e:Event): void { switch((e as Event).type) { case IOErrorEvent.IO_ERROR: /*treat it like IOErrorEvent*/   break; case Event.CLOSE:/*treat it like Event.CLOSE*/ break; case HTTPStatusEvent.HTTP_STATUS:       /*treat it like HTTPStatusEvent*/ break; }};
    return fn;
}

private function createURLLoader(url: String, description: String = 'i never care'):void{
     var urlo:URLLoader = new URLLoader();
     var fun: Function = createListener();
     urlo.addEventListener(IOErrorEvent.IO_ERROR, fun);
     urlo.addEventListener(Event.CLOSE, fun);
     urlo.addEventListener(HTTPStatusEvent.HTTP_STATUS, fun);
     var info: Object = { 'url' : url , 'description' : description );
     urlo.load(new URLRequest(info['url']))
     funcArray.push(fun);
     loaderArray.push(urlo);
     infoArray.push(info);//mention that arrays have always equal length and dispatcher, listener and descrition are stored under the same index
}
/*when data is loaded/loading timeout is over/loading failed: we need to be careful
 killing our anonimous vars:  */

private function killEmAll(i:int):void{//i is the index for arrays 
    (loaderArray[i] as URLLoader).removeEventListener(IOErrorEvent.IO_ERROR, (funcArray[i] as Function));
    (loaderArray[i] as URLLoader).removeEventListener(Event.CLOSE, (funcArray[i] as Function));
    (loaderArray[i] as URLLoader).removeEventListener(HTTPStatusEvent.HTTP_STATUS, (funcArray[i] as Function)); 
    (loaderArray[i] as URLLoader).close();//just to be sure ;)
     loaderArray.splice(i, 1);
     funcArray.splice(i, 1);
     infoArray.splice(i, 1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...