Ваша 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, и все они были доведены до безумия.Так что не делай этого.