Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как вернуть XML сразу после загрузки (http://www.flasher.ru/forum/showthread.php?t=185708)

Isfet 19.10.2012 10:32

Как вернуть XML сразу после загрузки
 
есть класс XmlLoader
в нем функция
Код AS3:

                 public function getXmlData(var1:String,var2:String):void {
 
                        var date = new Date();
                        var req:URLRequest = new URLRequest("xml_path");
                                var sendVariables:URLVariables = new URLVariables();
                                req.method = URLRequestMethod.GET;
 
                                sendVariables.var1 = var1;
                                sendVariables.var2 = var2;
                                sendVariables.date = date;
                                req.data = sendVariables;
 
                                loader.load(req);
                                loader.addEventListener(Event.COMPLETE, xmlLoaded);
 
                        function xmlLoaded(event:Event):void {
                                if(event.target as URLLoader !=null){
                                        this.xml = new XML (event.target.data);//вот этот xml нужно вернуть
                                }
                                dispatchEvent(new Event(Event.COMPLETE))
                        }
                }

есть допустим класс Main

Код AS3:

public function Main() {
                        var xmlLoader:XmlLoader = new XmlLoader();
//тут хотелось бы получить нечто следующее
//тоесть чтобы класс XmlLoader возвращал xml по введенным параметрам
                          var xml:XML = xmlLoader.getXmlData("var1Value","var2Value");
                }

но пока приходится использовать такую конструкцию
Код AS3:

public function Main() {
                        var xmlLoader:XmlLoader = new XmlLoader();
xmlLoader.addEventListener(Event.COMLETE,onComplete)
 
                }
        function onComplete(event:Event):void {
            var xml:XML = xmlLoader.getXml(); // возвращает переменную xml  из класса XmlLoader
//дальше уже что-нибудь делаю с XML
 
        }

тоесть мне нужно чтобы класс XmlLoader сам дожидался загрузки xml и тогда возвращал его, чтобы из любого места проекта можно было написать функцию
Код AS3:

var xml:XML = xmlLoader.getXmlData("var1Value","var2Value");

и сразу получить результат, а не плодить листенеров.

Inet_PC 19.10.2012 11:06

Так сделать не получится, так как загрузка происходит асинхронно.

Isfet 19.10.2012 11:13

то есть только диспатчить onComplete, и по нему вытаскивать из xmlLoader-a переменную с XML?

Krusty 19.10.2012 11:41

Цитата:

Сообщение от Isfet (Сообщение 1100457)
то есть только диспатчить onComplete, и по нему вытаскивать из xmlLoader-a переменную с XML?

Не диспатчить, а слушать Event.COMPLETE. Но вообще да, это же асинхронная модель.

Korchy 19.10.2012 11:51

Моно вместо функции вызова написать обертку с таймером, который через определенные интервалы будет проверять, не загрузился ли xml, и когда он загрузится, запишет указатель. Но это получатся костыли, листенер принципиально делает тоже самое, но проще и удобнее.

Isfet 19.10.2012 12:02

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

   public function Main() {
                var xmlLoader:XmlLoader = new XmlLoader();
                      xmlLoader.addEventListener(Event.COMLETE,onComplete)
 
  }
  function onComplete(event:Event):void {
            var xml:XML = xmlLoader.getXml()
 }

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

PainKiller 19.10.2012 12:21

Цитата:

чтобы не писать один и тот же код много раз,
если вы используете ООП этого делать не придется. Я например прописываю код загрузки один раз:
Код AS3:

public function loadPic (path:String, callBack:Function):void
                {
                        var loader:Loader = new Loader ();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, callBack);
                        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, securityErrorHandler);
                        loader.load(new URLRequest(path));
                }

и потом использую эту функцию в экземплярах и наследниках этого класса, например так:
Код AS3:

loadPic (SITE_URL + data.image[1].image_path, makePreviewPic);

где makePreviewPic - коллбек, который обрабатывает и размещает полученное изображение. Способов проще и удобней я не придумал :-)

Isfet 19.10.2012 12:42

спасибо, это как раз то что нужно.
А можете еще написать пример коллбэк функции?
что-то вроде такого?
Код AS3:

 
function onCompleteXmlLoad(e:Event) {
                                        var xml:XML = (e.target as XmlLoader).getLoadedXml();
 
                                }


strangedk 19.10.2012 12:49

А еще XmlLoader можно переименовать в XMLDataManager и сделать синглтоном, и тогда можно будет слушать события одного экземпляра во всех классах которые подписаны.

Идея с callback тоже неплоха

PainKiller 19.10.2012 13:16

Isfet, да все верно вы написали, только присваивать полученные данные локальной переменной бессмысленно, и .getLoadedXml() лишнее

Код AS3:

function xmlLoaded(event:Event):void 
{                       
    this.xml = new XML (event.target.data);//вот этот xml нужно вернуть
}

так как то


Часовой пояс GMT +4, время: 19:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.