как вернуть значение из обработчика результата службы в flex? - PullRequest
0 голосов
/ 16 марта 2012

Я собираюсь вызывать только метод "clickfun ()", мне нужно значение urlPath после успешного возврата значения службы.но он выдает ошибки переполнения стека.Любая помощь, пожалуйста.

private function clickfun(eve:Event):String{
            languagecode = "assets/myFont_en.swf";
            Defaultlanguagecode = "assets/myFont_default.swf";
            var request:URLRequest = new URLRequest(languagecode);
            var xmlURLLoader:URLLoader = new URLLoader(request);
            xmlURLLoader.addEventListener(Event.COMPLETE,loadcompletefun);
            xmlURLLoader.addEventListener(IOErrorEvent.IO_ERROR,ioerrorFun);
            xmlURLLoader.load(request); 
            return getpath();

        }

        private function getpath():String{
            if(loadcomplete == true){
                Alert.show(urlpath);
                return urlpath;
            }else
                return getpath(); 


        }
        private function loadcompletefun(e:Event):void{
            loadcomplete = true;
            urlpath = languagecode;
        }
        private function ioerrorFun(e:IOErrorEvent):void{
            loadcomplete = true;
            urlpath = Defaultlanguagecode;
        }



<mx:Panel title="Embedded Fonts Using ActionScript" width="800" height="500">
            <mx:Button label="Click" id="btn" click="clickfun(event)"/>
</mx:Panel>

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Очевидным для вашего кода удаленного взаимодействия является то, что загрузчики загружают данные асинхронно.Это означает, что выполнение программы продолжается, пока загрузчики загружают данные в (практически) другой поток.

Проблема здесь, вы звоните getpath() сразу после того, как вы начали загрузку.Это делает loadcomplete false, а функция getpath продолжает повторяться и стек переполняется.

То, что вы ДОЛЖНЫ сделать так:

Позвольте вашему классу отправлять событие.Скажем, вы отправляете только событие Event.COMPLETE.

Сообщите об этом в IDE следующим образом:

Рядом с объявлением класса добавьте метаданные и сделайте расширение вашего класса EventDispatcher

//Imports and package declaration

[Event(name="complete", type="flash.events.Event")]
public class YourClassName extends EventDispatcher {

    //Remaining part of class here

Затем, в вашем loadcompletefun, добавьте это

dispatchEvent(new Event(Event.COMPLETE));

И, в месте, где вы звоните clickfun, сделайте это:

o=new YourClassName();
o.addEventListener(Event.COMPLETE, gp);

и объявите gp как

private function gp(e:Event):void {
    trace(getpath());
    //You now have the ability to call getpath()
}
0 голосов
/ 16 марта 2012

Исходя из обзора кода, я предполагаю, что вы получаете сообщение об ошибке, поскольку переменные loadcomplete и urlpath не определены. поэтому убедитесь, что вы определили его в своем блоке ActionScript:

public var loadcomplete : Boolean
public var urlPath : String

Также убедитесь, что вы определяете languagecode и Defaultlanguagecode как переменные, используя тот же подход.

Любое из этих упущений может вызвать ошибку времени компиляции или выполнения.

...