Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.10.2012, 10:32
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 1  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
По умолчанию Как вернуть 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");
и сразу получить результат, а не плодить листенеров.

Старый 19.10.2012, 11:06
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 2  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Так сделать не получится, так как загрузка происходит асинхронно.
__________________
http://www.chessmax.ru

Старый 19.10.2012, 11:13
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 3  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
то есть только диспатчить onComplete, и по нему вытаскивать из xmlLoader-a переменную с XML?

Старый 19.10.2012, 11:41
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 4  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
Цитата:
Сообщение от Isfet Посмотреть сообщение
то есть только диспатчить onComplete, и по нему вытаскивать из xmlLoader-a переменную с XML?
Не диспатчить, а слушать Event.COMPLETE. Но вообще да, это же асинхронная модель.

Старый 19.10.2012, 11:51
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 5  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Моно вместо функции вызова написать обертку с таймером, который через определенные интервалы будет проверять, не загрузился ли xml, и когда он загрузится, запишет указатель. Но это получатся костыли, листенер принципиально делает тоже самое, но проще и удобнее.
__________________
interplanety

Старый 19.10.2012, 12:02
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 6  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
листенер конечно хорошо, но при этом , в каждом классе, который должен создать экземпляр загрузчика
нужно делать такую конструкцию:
Код AS3:
   public function Main() {
		var xmlLoader:XmlLoader = new XmlLoader();
                       xmlLoader.addEventListener(Event.COMLETE,onComplete)
 
  }
  function onComplete(event:Event):void { 
	    var xml:XML = xmlLoader.getXml();  
 }
должен быть унаверсальней подход, чтобы не писать один и тот же код много раз, а разместить как-нибудь этот код в классе-загрузчике.

Старый 19.10.2012, 12:21
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 7  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Цитата:
чтобы не писать один и тот же код много раз,
если вы используете ООП этого делать не придется. Я например прописываю код загрузки один раз:
Код 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 - коллбек, который обрабатывает и размещает полученное изображение. Способов проще и удобней я не придумал :-)

Старый 19.10.2012, 12:42
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 8  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
спасибо, это как раз то что нужно.
А можете еще написать пример коллбэк функции?
что-то вроде такого?
Код AS3:
 
function onCompleteXmlLoad(e:Event) {
					var xml:XML = (e.target as XmlLoader).getLoadedXml();
 
				}

Старый 19.10.2012, 12:49
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 9  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
А еще XmlLoader можно переименовать в XMLDataManager и сделать синглтоном, и тогда можно будет слушать события одного экземпляра во всех классах которые подписаны.

Идея с callback тоже неплоха
__________________
adobe AS3 manual

Старый 19.10.2012, 13:16
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 10  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Isfet, да все верно вы написали, только присваивать полученные данные локальной переменной бессмысленно, и .getLoadedXml() лишнее

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:42.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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