AS3: вернуть массив из прослушивателя событий? - PullRequest
3 голосов
/ 07 февраля 2010

У меня есть прослушиватель событий, примененный к загрузке XML, и в настоящее время он отслеживает значения, которые он захватывает, и это хорошо, но я хочу, чтобы он возвратил массив для использования. У меня есть создание и возврат массива, работающий из «LoadXML» (он возвращает массив), но я не могу заставить его работать со слушателем событий.

Слушатель событий прекрасно выполняет функцию «LoadXML», но я понятия не имею, как взять возвращаемый массив для использования, это пример того, как мой слушатель событий работает прямо сейчас:

xmlLoader.addEventListener(Event.COMPLETE, LoadXML());

и мое предположение о том, как бы я взял массив (это не работает):

var rArray:Array = xmlLoader.addEventListener(Event.COMPLETE, LoadXML());

поэтому вместо этого я попробовал следующее:

xmlLoader.addEventListener(Event.COMPLETE, function():Array{
    var rData:Array = LoadXML(datahere);
    return rData;
}

но это тоже не стоит.

Итак: Как мне вернуть массив из обработчика событий? Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 февраля 2010

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

При добавлении прослушивателя событий вы должны передать ссылку на функцию, которая будет вызвана позднее. Затем, когда эта функция вызывается, она передает объект Event с любыми извлеченными данными для работы с. Вот пример:

xmlLoader.addEventListener(Event.COMPLETE, handleLoadComplete/*Note: No brackets, this is a reference*/);

//will be called at a later time, not instantly.
function handleLoadComplete(e:Event):void {
    var xml:XML = xmlLoader.data as XML;
    //do what ever you want this the XML...
}

Надеюсь, это прояснит ситуацию для вас.

Счастливого кодирования!

1 голос
/ 07 февраля 2010

Почему бы просто не использовать объект уровня компонента и установить его значение (содержимое xml в вашем методе LoadXML())?

var rArray:Array;
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);

private function LoadXML(event:Event=null):void {
    // set this.rArray in here...
}
0 голосов
/ 07 февраля 2010

Возможно, чтобы returnArray содержал массив, созданный convertXML, но не так, как вы пытаетесь это сделать. Flash просто так не работает.

Это примерно то, что происходит, когда вы запускаете код из pastebin:

  1. Запустить запуск функции loadInformation ()
  2. Скажите Flash, что когда xmlLoader загружается полностью, он должен запустить LoadXML ()
    • xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
  3. Начать загрузку файла XML
    • xmlLoader.load(new URLRequest(xmlurl));
  4. Скажите Flash, что такое LoadXML () (и convertXML ())
    • function LoadXML(e:Event):void {...}
  5. Прекратить выполнение функции loadInformation ()
  6. Flash отключается и выполняет другие действия в ожидании загрузки файла XML
  7. Файл XML завершает загрузку. Flash вызывает LoadXML (), как было сказано.
    • Обратите внимание, что LoadXML () вызывается Flash, не loadInformation ().
  8. LoadXML () обрабатывает файл XML.

Чтобы получить преобразованные данные массива, вам нужно сделать что-то вроде ответа clownbaby: установить значение returnArray напрямую, находясь внутри LoadXML.

var returnedArray:Array;

loadinformation("http://website.com/xml.xml");

function loadinformation(xmlurl:String):Array{
    var xmlLoader:URLLoader = new URLLoader();
    var xmlData:XML = new XML();
    xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
    xmlLoader.load(new URLRequest(xmlurl));
}

function LoadXML(e:Event):void {
    xmlData = new XML(e.target.data);
    returnedArray = convertXML(xmlData);
}

function convertXML(xml):Array{
    // Does some stuff with the XML and returns an array
    return rArray;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...