Как мне обрабатывать Asynctokens в классах Actionscript

#apache-flex #actionscript-3 #remoteobject #asynctoken

#apache-flex #actionscript-3 #remoteobject #asynctoken

Вопрос:

Вот мой код:

 public class Schem
{
    public var info:String="";
    private var ro:RemoteObject = new RemoteObject("Hibernatetest");



    public function Schem()
    {       
        ro.endpoint = "http://jesus/blazeds/messagebroker/amf";
    }

    public function loadCurrentSchem():void
    {


        var token:AsyncToken = ro.getCells();
        token.addResponder(new AsyncResponder(onResult,onFault));

        info = info   "Loader Called ...";


    }

    private function onResult(event:ResultEvent,token:Object):void {
        var cellList:ArrayCollection = event.result as ArrayCollection;
        info = info   "Resulthandler Called";

    }

    private function onFault(event:FaultEvent,token:Object):void
    {

    }
    //Eventhandlers


    //Getters, Setters


}
  

Проверив строку info, я обнаружил, что класс не достигает результата позже, когда я вызываю loadCurrentSchem(). Почему это?

Ответ №1:

Прежде всего, я не вижу, в чем у вас есть преимущества асинхронного токена? Асинхронный токен — это шаблон для инкапсуляции всей информации об одном запросе и его состоянии в одном объекте. Вы можете прочитать больше здесь.

В вашем случае все, что вам нужно, это получить событие результата запроса. Лучший способ сделать это — использовать RemoteObject события (см. документацию). Таким образом, код будет выглядеть следующим образом:

 public class Schem
{
    public var info:String="";
    private var ro:RemoteObject;



    public function Schem()
    {
        ro = new RemoteObject("Hibernatetest");
        ro.endpoint = "http://jesus/blazeds/messagebroker/amf";
        ro.addEventListener(ResultEvent.RESULT, onResult);
        ro.addEventListener(FaultEvent.FAULT, onFault);
    }

    public function loadCurrentSchem():void
    {
        ro.getCells();
        info = info   "Loader Called ...";
    }

    private function onResult(event:ResultEvent):void {
        var cellList:ArrayCollection = event.result as ArrayCollection;
        info = info   "Resulthandler Called";
    }

    private function onFault(event:FaultEvent):void
    {
        info = info   "Errorhandler Called";
    }
    //Eventhandlers


    //Getters, Setters
}
  

Комментарии:

1. Я знаю о решении, которое вы описали. Я не могу его использовать, потому что, пока remoteobjects получает свои данные, выполняется оставшийся код. При использовании asynctoken выполнение откладывается до поступления данных — вот почему я его использую. С другой стороны, я хотел бы видеть проблему решенной, потому что приведенный выше код отлично работает в тегах script, но в отдельном классе это не так.

2. Хм. Мне кажется, вы не совсем понимаете модель потока кода Flash Player. Дело в том, что оба способа абсолютно эквивалентны с точки зрения выполнения кода, и оба они асинхронны. Пожалуйста, опишите, что вы имеете в виду, когда «remoteobjects получает свои данные, оставшийся код выполняется. При использовании asynctoken выполнение откладывается до поступления данных «.

3. Это вполне может быть так. И я был бы рад, если бы вы научили меня. 🙂 Итак: Вот такая ситуация. У меня есть несколько java-объектов, которые я сериализую и получаю для каждого remoteobject. По сути, это объекты данных. Из этих объектов данных во время выполнения создается DisplayObject (компонент пользовательского интерфейса). Теперь я работал с простыми remoteobject — обработчиками, но возникла проблема: проигрыватель создал Displayobject, не получив полный объект данных. Я подумал, что asynctoken может быть решением этой проблемы. Может быть, я ошибаюсь?

4. Да, вы ошибаетесь. Проблема не связана с тем, как обрабатываются результаты удаленного объекта (я имею в виду использование асинхронного токена или событий), поскольку результат в обоих случаях асинхронный. Я полагаю, проблема в вашей логике GUI. Я полагаю, SO — подходящее место, чтобы задать вопрос об этом 🙂

5. Хорошо, я представлю свой код, как только вернусь домой на свою рабочую станцию. Спасибо!