Как я могу использовать addEventListener и вернуть что-то, что изменилось из этого в Actionscript? - PullRequest
0 голосов
/ 19 июня 2011
private function getTitle(src:String):String{
            var urlLoader:URLLoader = new URLLoader();
            var rssURLRequest:URLRequest = new URLRequest(src);
            var rss:XML = new XML;
            var t:String = src;
            urlLoader.addEventListener(Event.COMPLETE, 
                                       function(event:Event):void{
                                           rss = XML(urlLoader.data);
                                           t = rss.channel.title.toString();
                                        });
            return t;
        }

Я знаю, что этот код не работает, потому что анонимная функция не работает, пока не вернется t. Как бы я сделал так, чтобы это работало?

1 Ответ

4 голосов
/ 19 июня 2011

Вы не сможете вернуть загруженные данные из этого метода. Причина этого в том, что загрузка асинхронна и не блокирует выполнение последующего кода. Лучший вариант - вывести переменные из области действия функции и написать вторую функцию для обработки события COMPLETE.

Должно работать что-то вроде следующего:

var rss:XML;
var t:String;
var path:String = "some path";
var urlLoader:URLLoader = new URLLoader();


private function getTitle(src:String):String
{
     urlLoader.load( new URLRequest( src ) );
     urlLoader.addEventListener(Event.COMPLETE, onComplete );
}

private function onComplete(event:Event):void
{
     rss = XML(urlLoader.data);
     t = path + rss.channel.title.toString();
}

Я понимаю, что на самом деле это не дает прямого ответа на вопрос, хотя это лучшая практика для обработки загрузки данных. Если вы действительно хотите остановить выполнение какого-либо кода до загрузки данных, возможно, можно использовать цикл while после строки addEventListener, чтобы остановить проигрыватель до загрузки данных. Это, вероятно, следует считать не таким элегантным взломом.

private function getTitle(src:String):String
{
     var urlLoader:URLLoader = new URLLoader();
     var rssURLRequest:URLRequest = new URLRequest(src);
     var rss:XML = new XML;
     var t:String = src;
     var complete:Boolean;
     urlLoader.addEventListener(Event.COMPLETE, 
                                  function(event:Event):void
                                  {
                                       rss = XML(urlLoader.data);
                                       t = rss.channel.title.toString();
                                       complete = true;
                                  });
     while( !complete ) { /* sleep hack */  }
     return t;
}

Я не проверял это, но, похоже, это могло сработать. Первый пример рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...