#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. Хорошо, я представлю свой код, как только вернусь домой на свою рабочую станцию. Спасибо!