Я пытаюсь создать общий класс XMLLoader со статическим методом LOAD
с намерением использовать его следующим образом...
private var _data:XML = XMLLoader.LOAD("path/to/xml_file.xml");
Тогда я мог бы использовать его в любом клиенте и отправиться в город с e4x.
Общая проблема, с которой я сталкиваюсь, связана с событием COMPLETE
URLLoader, которое обязательно вызывает другую функцию для установки данных XML. Это не позволяет мне вернуть XML из метода LOAD
, так как данные устанавливаются вне этой функции. Очевидно, мне нужно дождаться события COMPLETE
, чтобы убедиться, что данные доступны.
Хотя, возможно, я мог бы создать и вернуть функцию _waitForData
, которая рекурсивно вызывает себя до тех пор, пока не будут установлены _data, а затем возвращает данные. Но это кажется излишним (поскольку Event.COMPLETE
все равно это делает), и то, как я пытался, генерирует ошибку переполнения стека.
Вот что я пробовал:
public class XMLLoader {
private static var _url:String = "";
private static var _data:XML = null;
public static function LOAD(url:String):XML {
_url = url;
var _xmlLoader:URLLoader = new URLLoader();
_xmlLoader.addEventListener(Event.COMPLETE, _setData);
_xmlLoader.load(new URLRequest(_url));
return _waitForData();
}
static function _setData(e:Event):void {
XML.ignoreWhitespace = true;
_data = new XML(e.target.data);
}
static function _waitForData():XML {
if( _data == null ) {
_waitForData();
}
return _data;
}
public function LoadXML() {}
}
Я новичок в концепции рекурсивных функций, поэтому у меня такое чувство, что я неправильно реализовал свою функцию _waitForData (если это вообще хорошая идея).
Я был бы признателен за любые указатели на использование статических методов таким образом, и возможно ли то, что я пытаюсь сделать... кажется хорошей идеей, я думаю.