![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
Привет всем..
Вообщем проблема такая: есть Main класс, которой создает класс парсера XML, но в классе А функция, вызываемая AddEventListener'ом выполняется после trace(classA.commandsOfObject), то есть конструктор Main не ждет пока выполнится AddEventListener класса А. Если кто сталкивался с такой проблемой, подскажите как ее решить плиз. package classes { import classes.A; import flash.events.Event; public class Main { public var classA:A; public function Main(str:String){ classA= new A(str); trace(classA.commandsOfObject); } } } package classes { import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; public class A { public var xmlPath:String; public var arrayCommandsOfObject:Array = new Array(); public var arrayCoordsOfObject:Array = new Array(); public var vectorCommandsOfObject:Vector.<int> = new Vector.<int>(); public var vectorCoordsOfObject:Vector.<Number> = new Vector.<Number>(); public var commandsOfObject:String; public var coordsOfObject:String; public var loader = new URLLoader(); public var xml:XML; public function A(xmlPath:String) { this.xmlPath=xmlPath; loader.load(new URLRequest(xmlPath)); loader.addEventListener(Event.COMPLETE, xmlLoaded); function xmlLoaded(e:Event):void { var i:int = 0; var j:int = 0; if ((e.target as URLLoader) != null ) { xml = new XML(loader.data); for each (var command:XML in xml.commands.command) { commandsOfObject=command; this.arrayCommandsOfObject = commandsOfObject.split(","); trace(commandsOfObject); } for each (var coord:XML in xml.coords.coord) { coordsOfObject=coord; this.arrayCoordsOfObject = coordsOfObject.split(","); } } } } } } |
|
|||||
|
Так и должно быть. Код выполняется мгновенно. А загрузка документа выполняется асинхронно. Поэтому необходимо некоторое время, чтобы хмл загрузился. И пока он загрузится - код в конструкторе Main уже давно выполнится. Как решить? Все зависит от того что вы хотите сделать. Большинство начинающих программистов мечтают создать волшебный фабричный метод, в который передаешь адрес, а он тебе возвращает хмл. Я когда-то тоже о таком мечтал. Но это нельзя сделать. Нужно ждать пока хмл загрузится.
Можно так: в классе А в функции xmlLoaded в самом ее конце напишите: А в классе Main, тогда напишите: package classes { import classes.A; import flash.events.Event; public class Main { public var classA:A; public function Main(str:String){ classA= new A(str); classA.addEventListener(Event.COMPLETE, xmlLoaded); } private function xmlLoaded (e:Event):void { classA.removeEventListener(Event.COMPLETE, xmlLoaded); trace(classA.commandsOfObject); } } } PS: класс A обязательно должен быть унаследован от EventDispatcher
__________________
Я мало чего умею, но зато хорошо умею учиться... Последний раз редактировалось HardCoder; 26.03.2012 в 09:57. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
И лучше все же вынести метод, стартующий загрузку, в отдельный паблик. Хотя бы ради простой логики – сначала подписываемся на событие, а ПОТОМ запускаем процесс, который может привести к этому событию. А не наоборот.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
все работает только вместо этого
пишем
|
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Требую разъяснений!
__________________
Загружаем картинки, минуя ошибки безопасности |
![]() |
![]() |
Часовой пояс GMT +4, время: 04:45. |
|
|
« Предыдущая тема | Следующая тема » |
|
|