Возврат разобранного XML-значения в Actionscript - PullRequest
0 голосов
/ 19 марта 2011

Я пытаюсь извлечь XML-файл из Интернета, проанализировать его и вернуть из него значение, все из одной функции, используя Actionscript 3.0.

Вот мой код:

public function getValue(aWord:String):void
{    
    var xml:XML;
    var urlLoader:URLLoader = new URLLoader();
    urlLoader.addEventListener(Event.COMPLETE,onXMLLoaded);
    urlLoader.load(new  URLRequest("SOMEXMLFILE.xml")); // I use the aWord parameter in fetching the xml file


    function onXMLLoaded(e:Event):String{
        xml =  new XML(e.target.data);
        trace(xml);
        return (xml.bestmatch.dictionary.text());
    }
    return ""; //THIS NEEDS TO RETURN THE VALUE FOUND IN THE onXMLLoaded FUNCTION
}

В идеале локальная функция "onXMLLoaded" может быть назначена переменной; например,

var text:String = function onXMLLoaded .....

и тогда я просто возвращаю переменную "текст". Тем не менее, компилятор жалуется, когда я пытаюсь сделать это. Как я могу вернуть значение, найденное в функции onXMLLoaded, в вызывающую функцию getValue?

Спасибо!

1 Ответ

0 голосов
/ 19 марта 2011

Ваша var text:String = function onXMLLoaded ... идея не будет работать, потому что этот оператор делает назначение самой функции onXMLLoaded (типа Function) переменной text типа String, котораявот почему он не будет компилироваться.

Короче говоря, нет простого способа сделать синхронные вызовы внешних источников (например, XML, веб-сервисов) в Actionscript.Поначалу это очень раздражает людей, пришедших из типичной среды разработки типа C / Java, включая меня самого.Многие типичные шаблоны проектирования, которые распространены в языках C-типа, просто невозможны в Actionscript.Вы никогда не сможете вернуть результат вашего вызова URLLoader из той же функции;это просто способ построения языка.

Один из способов обойти это - передать параметр в вашу функцию и создать анонимную функцию, которая устанавливает значение для объекта, содержащего текст, например:

public function getValue(aWord:String, textToSetObject:Object):void
{    
    var xml:XML;
    var urlLoader:URLLoader = new URLLoader();
    urlLoader.addEventListener(Event.COMPLETE,
        function (e:Event) : void
        {
            textToSetObject.text = new XML(e.target.data).bestmatch.dictionary.text();
        }
    );
    urlLoader.load(new  URLRequest("SOMEXMLFILE.xml"));        
}

Затем вы можете вызвать эту функцию с помощью getValue("string", someObject);, и через некоторое время someObject.text будет равен результату вашего вызова XML.

Ключевое слово заключается в том, что через некоторое время после 1018 *.Поскольку это асинхронный вызов (даже если это локальный файл XML), вы никогда не сможете точно знать, когда завершится вызов.Если вы попытаетесь сделать getValue("string", someObject); trace(someObject.text), вы, скорее всего, получите ошибку, поскольку вызов не будет завершен при выполнении оператора трассировки.

Надеюсь, это имело смысл.Понимание асинхронной архитектуры AS3 является сложным вопросом и чрезвычайно важным.Но в заключение: многие люди старались изо всех сил приспособить синхронные вызовы к AS3, и все они были доведены до безумия.Так что не делай этого.

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