Асинхронная операция в Actionscript - PullRequest
0 голосов
/ 16 июля 2011

Я прочитал кое-что об асинхронных ожиданиях в 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.

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Был ответ здесь от кого-то другого, который отлично ответил на ваш вопрос, я не знаю, куда он пошел.

В любом случае, поскольку вызов асинхронный, Flex собирается запустить событие загрузки, а затем продолжить транспортировку до следующей строки. Что вам нужно сделать, так это дождаться, пока Flex получит ответ от сервисного вызова, ПОТОМ вы можете сослаться на xml.

Это можно получить, поместив код doSomething в обработчик Event.COMPLETE. Таким образом, вы знаете, что данные были загружены.

0 голосов
/ 16 июля 2011

Я «решил» проблему с аргументами, сделав все аргументы в этой функции также переменными класса, а затем используя эти переменные класса, чтобы проверить правильность формы. Это довольно грубое злоупотребление пространствами имен, но я не знаю, как еще это сделать. Даже если я дополню событие complete, я не смогу получить аргументы в классе URLLoader по умолчанию, что означает, что мне придется изменить встроенный класс URLLoader, чтобы он принимал пользовательские аргументы, и это слишком много, я чувствую то, что кажется типичная проблема.

Надеюсь, кто-нибудь придет и скажет мне лучшее решение, я буду следить за ним, до сих пор это временное исправление, которое заставляет код работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...