Я прочитал кое-что об асинхронных ожиданиях в Actionscript, но не могу это сделать на практике.Вот короткая, упрощенная версия моего кода, который у меня есть в классе:
private function getXML():void {
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETE, loadXML);
xmlLoader.load(new URLRequest("test.xml"));
}
private function loadXML(evt:Event):void {
var xmlData:XML = new XML(evt.target.data);
this.parseResults(xmlData);
}
private function parseResults(resultsInput:XML):void {
this.text = resultsInput.Node.attributes()[0];
}
Это стандартное get xml, когда оно завершается, запускает событие, а затем публикует первый атрибут на узле в переменной класса text
.
Функция, с которой я хочу вызвать это:
// assume doSomething("circle") was called
private function doSomething(shape:String):String {
this.getXML();
if (this.text == shape) {
// draw circle
return "Drew circle";
} else {
return "Not a circle in the node";
}
}
Проблема в том, что я всегда получаю Not a circle in the node
, потому что шаг обработки ниже getXML () выполняется быстрее, чем может событиезагрузить, запустить, а затем сохранить в переменной класса для проверки.Я прочитал все: от использования анонимных функций до ожидания или использования состояний или добавления прослушивателей событий в функции (это возможно?), Но я не могу реализовать их правильно (или не понял, как реализовать правильно), поэтому кто-то может дать мнепример того, как я могу сделать это с помощью приведенного выше кода?
То, что я пробовал и не сработало:
Объявление переменной функции в getXML (), чтобы функция не былавыполняется до тех пор, пока xml не будет прочитан
var f:Function = function loadXML(evt:Event):void {... etc.
then calling f in getXML
Не работает, я не уверен, как вызвать функциональные переменные в Actionscript для выполнения этой работы
Объявление переменной состояния xmlLoaderState
in getXML()
if (this.xmlLoaderState == "waiting") {
this.xmlLoaderState = "busy";
}
in parseResults at the end
this.xmlLoaderState = "waiting"
then in doSomething()
while (this.xmlLoaderState == "busy") {}
Это бесконечные циклы, я предполагаю, что это потому, что существует только один поток, поэтому цикл также блокирует xmlLoader.