Вы не хотите идти по полностью статическому маршруту. Это беспорядок, усложняет вещи без необходимости, трудно поддерживать, и что, если вы хотите загрузить два xmls одновременно? (подсказка: вы не можете).
Вам лучше создать обычный класс, который будет делать то, что вы хотите (загрузить XML и отправить событие или вызвать функцию с результатами). Затем вы можете добавить более простой интерфейс для вашего кода вызова; если это статическая функция, которая будет использоваться в качестве однострочника, пусть будет так. Эта функция может рассматриваться как некая фабрика, которая инициирует создание экземпляра класса, а также инициирует операцию загрузки, устанавливающую обратный вызов результата, все за один шаг (с точки зрения вызывающей стороны)
Я думаю что-то в этом роде (просто написал и скомпилировал нормально; не проверил это полностью, но этого должно быть достаточно, чтобы дать идею).
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.utils.Dictionary;
public class XMLLoader extends EventDispatcher
{
private var _loader:URLLoader;
private var _data:XML;
private var _callback:Function;
private static var _map:Dictionary = new Dictionary();
public function XMLLoader(callback:Function = null)
{
_data = null;
_callback = callback;
_loader = new URLLoader();
_loader.addEventListener(IOErrorEvent.IO_ERROR,handleError);
_loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,handleError);
_loader.addEventListener(Event.COMPLETE,handleComplete);
}
public function load(request:URLRequest):void {
_loader.load(request);
}
private function dispatchError():void {
cleanUp();
dispatchEvent(new Event(Event.COMPLETE));
if(_callback is Function) {
_callback(null);
}
}
private function dispatchSuccess():void {
cleanUp();
dispatchEvent(new Event(Event.COMPLETE));
if(_callback is Function) {
_callback(_data);
}
}
private function handleError(e:Event):void {
dispatchError();
}
private function handleComplete(e:Event):void {
var success:Boolean = false;
try {
_data = new XML(e.target.data);
success = true;
} catch(err:TypeError) {
success = false;
} finally {
if(success) {
dispatchSuccess();
} else {
dispatchError();
}
}
}
public function get data():XML {
return _data;
}
private function cleanUp():void {
if(_loader) {
_loader.removeEventListener(IOErrorEvent.IO_ERROR,handleError);
_loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,handleError);
_loader.removeEventListener(Event.COMPLETE,handleComplete);
}
if(_map[this]) {
delete _map[this];
}
}
public static function loadXml(url:String,callback:Function):XMLLoader {
var loader:XMLLoader = new XMLLoader(callback);
loader.load(new URLRequest(url));
// pin down the instance just to be safe; I've seen loaders being collected...
_map[loader] = true;
return loader;
}
}
}
Использование:
private function handleResult(data:XML):void {
if(data) {
trace(data);
} else {
trace("failed");
}
}
private function test():void {
XMLLoader.loadXml("your.xml",handleResult);
}
Кроме того, вы можете переключиться на использование методов экземпляра, если вам нужна большая гибкость:
private function test():void {
var loader:XMLLoader = new XMLLoader(handleResult);
loader.load(new URLRequest("your.xml"));
}
Этот пример реализации может использоваться с обратным вызовом или событиями. Для простоты я просто определяю одну функцию обратного вызова; Вы можете определить, была ли успешной операция загрузки, проверив полученные данные; ноль означает, что это не удалось. Кроме того, я отправляю событие Event.COMPLETE, чтобы сообщить о завершении загрузки загрузчика (даже если это не удалось); Опять же, вы можете узнать, провалился ли он или нет, проверив свойство data. Вы можете использовать пользовательские события, если хотите, и / или определить обратный вызов сбоя, но я думаю, что вам нужен как можно более простой интерфейс, поэтому я думаю, что этого должно быть достаточно.